在三维空间中存储点的信息

5 投票
8 回答
8069 浏览
提问于 2025-04-15 11:50

我正在用Python写一些代码(目前只是为了好玩),目的是在三维空间中的每个点上存储一些数据。简单来说,我想要一个三维矩阵对象,可以存储任意对象,这样我就能进行一些高级选择,比如:

  • 获取坐标为x=1,y=2,z=3的点。
  • 获取所有y=2的点。
  • 获取距离坐标x=1,y=2,z=3三单位以内的所有点。
  • 获取所有点,其中point.getType() == "Foo"

在以上所有情况下,我都需要得到一些输出,能够告诉我在空间中的原始位置,以及在那个点上存储的数据。

听说numpy可以做到我想要的,但它似乎是为科学计算高度优化的,而我到现在还没搞清楚怎么像我想的那样获取数据。

有没有更好的选择,还是我应该继续在numpy上碰壁呢?:)

补充说明:根据前面三个回答,我意识到我应该补充一些信息:我不太担心性能,这纯粹是一个概念验证,我更希望代码简洁,而不是性能好。我还会在给定的三维空间中的每个点上都有数据,所以我想稀疏矩阵可能不太合适?

8 个回答

1

numpy的一个优点就是速度非常快,比如说计算一个8000x8000的邻接矩阵的页面排名,只需要几毫秒。虽然numpy.ndarray只接受数字,但你可以在外部用哈希表(也就是字典)来存储数字和对象的对应关系,而字典本身也是一种经过高度优化的数据结构。

在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]]

如果你把一些想要的函数(比如距离计算)包装在一个核心矩阵和一个对象映射的哈希表周围,你就可以在短时间内让你的应用程序运行起来。

祝你好运!

3

嗯……如果你想要真正地“填满”那个空间,那么你最好使用一种像矩阵一样紧凑的结构,基本上就是体素

如果你不打算填满它,可以考虑一些更优化的方案。我建议你先看看八叉树,这种结构通常用于类似的情况。

6

这里有另一种常见的方法

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 三个单位以内的所有点。

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

获取所有类型为 "Foo" 的点。

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

撰写回答