我有一个三维坐标。我想将它映射到一维索引。据我所知,可以使用配对功能在二维情况下处理这个问题。但是,我已经为3D案例提出了以下天真的实现:
from numpy import *
# the size of the coordinate space
xn = 100
yn = 100
zn = 100
# make a 3 dimensional matrix of zeros
m = zeros((xn,yn,zn))
def xyz_to_index(m,x,y,z):
# set a particular coordinate to 1
m[x,y,z] = 1
# find its index
i = argmax(m)
# rezero matrix
m[x,y,z] = 0
# return 1D index
return i
此代码允许我从3D点映射到1D索引,如下面的ipython日志所示:
In [40]: xyz_to_index(m,34,56,2)
Out[40]: 345602
所以现在我的问题是,有更好的方法吗?我认为遍历矩阵并不是进行此坐标转换的最有效方法。你会做什么呢?
答案 0 :(得分:2)
您可以为任意维度的NumPy数组实现函数ravel_index()
:
def ravel_index(x, dims):
i = 0
for dim, j in zip(dims, x):
i *= dim
i += j
return i
此函数与函数numpy.unravel_index()
的反函数。
对于您的应用程序,您可以将此功能称为ravel_index((x, y, z), m.shape)
。
答案 1 :(得分:2)
此处提供了一般解决方案:
Numpy interconversion between multidimensional and linear indexing
但基本上如果您知道多维空间的形状:
def ravel_index(x, dims):
c = np.cumprod([1] + dims[::-1])[:-1][::-1]
return np.dot(c,x)
s = [100,100,100] # shape of dims
ii = [34,56,2] # 3d index
jj = ravel_index(ii,s) # 1d index
答案 2 :(得分:1)
如果您事先知道所有坐标都在0..99范围内,您可以通过以下函数轻松计算索引:
def xyz_to_index(x,y,z):
return ((x * 100) + y) * 100 + z