在3D空间中储存点信息

2024-04-29 08:15:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python编写一些代码(目前只是为了好玩),这些代码将在3d空间的每个点上存储一些数据。我基本上是在追求一个三维矩阵对象,它存储了一些允许我进行一些高级选择的任意对象,比如:

  • 得到x=1,y=2,z=3的点。
  • 得到y=2的所有点。
  • 得到位置x=1,y=2,z=3的3个单位内的所有点。
  • 获取point.getType()=“Foo”处的所有点

在上面的所有内容中,我需要得到某种输出,它将给出空间中的原始位置,以及存储在该位置的数据。

显然,numpy可以做我想做的事情,但它似乎高度优化了科学计算,并解决了如何获得我想要的数据,就像上面所说的,至今我都没有找到。

有没有更好的选择,或者我应该回去把我的头撞在墙上?:)

编辑:更多信息前三个答案让我意识到我应该包括:我不担心性能,这纯粹是一个概念的证明,我更喜欢干净的代码而不是良好的性能。我也会有数据为每个点在给定的三维空间,所以我猜一个备用矩阵是坏的?


Tags: 数据对象代码numpy内容高度foo空间
3条回答

下面是另一种常见的方法

class Point( object ):
    def __init__( self, x, y, z, data ):
        self.x, self.y, self.z = x, y, z
        self.data = data
    def distFrom( self, x, y, z )
        return math.sqrt( (self.x-x)**2 + (self.y-y)**2 + (self.z-z)**2 )

database = [ Point(x,y,z,data), Point(x,y,z,data), ... ]

让我们看看您的用例。

得到x=1,y=2,z=3的点。

[ p for p in database if (p.x, p.y, p.z) == ( 1, 2, 3 ) ]

得到y=2的所有点。

[ p for p in database if p.y == 2 ]

得到位置x=1,y=2,z=3的3个单位内的所有点。

[ p for p in database if p.distFrom( 1, 2, 3 ) <= 3.0 ]

获取point.getType()=“Foo”处的所有点

[ p for p in database if type(p.data) == Foo ]

嗯。。。如果你真的希望用填充这个空间,那么你最好用一个密集的矩阵式结构,基本上是voxels

如果你不想填满它,那就找一些更优化的。我将从octrees开始,它通常用于这样的事情。

numpy的一个优点是它非常快, e、 g.计算8000x8000邻接矩阵的pagerank需要毫秒。即使numpy.ndarray只接受数字,您也可以将数字/id对象映射存储在外部哈希表(即dictionary)中(dictionary又是一个高度优化的数据结构)。

切片就像python中的列表切片一样简单:

>>> from numpy import arange

>>> the_matrix = arange(64).reshape(4, 4, 4)
>>> print the_matrix[0][1][2]
    6
>>> print the_matrix[0][1]
    [4 5 6 7]
>>> print the_matrix[0]
    [[ 0  1  2  3]
    [ 4  5  6  7]
    [ 8  9 10 11]
    [12 13 14 15]]

如果您将一些所需的函数(距离)包装在某个核心矩阵和一个id对象映射散列上,那么您可以让您的应用程序在短时间内运行。

祝你好运!

相关问题 更多 >