在三维空间中存储点的信息
我正在用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]]
如果你把一些想要的函数(比如距离计算)包装在一个核心矩阵和一个对象映射的哈希表周围,你就可以在短时间内让你的应用程序运行起来。
祝你好运!
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 ]