Python 将三维坐标映射到一维索引
我有一个三维坐标。我想把它映射到一维索引。据我所知,人们可以使用配对函数来处理二维情况。但是,我为3D案例提出了以下简单的实现:Python 将三维坐标映射到一维索引,python,numpy,coordinates,Python,Numpy,Coordinates,我有一个三维坐标。我想把它映射到一维索引。据我所知,人们可以使用配对函数来处理二维情况。但是,我为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
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到99之间,您可以通过以下函数轻松计算索引:
def xyz_to_index(x,y,z):
return ((x * 100) + y) * 100 + z
如果您事先知道所有坐标都在0..99范围内,则可以通过以下函数轻松计算索引:
def xyz_to_index(x,y,z):
return ((x * 100) + y) * 100 + z
您可以为任意维度的NumPy数组实现函数
ravel\u index()
:
def ravel_index(x, dims):
i = 0
for dim, j in zip(dims, x):
i *= dim
i += j
return i
此函数是该函数的逆函数
对于您的应用程序,可以将此函数称为
ravel_index((x,y,z),m.shape)
您可以为任意维度的NumPy数组实现函数ravel_index()
:
def ravel_index(x, dims):
i = 0
for dim, j in zip(dims, x):
i *= dim
i += j
return i
此函数是该函数的逆函数
对于您的应用程序,您可以将此函数称为
ravel_index((x,y,z),m.shape)
这里提供了一个通用解决方案:
但基本上如果你知道多维空间的形状:
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
这里提供了一个通用解决方案: 但基本上如果你知道多维空间的形状:
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
你的矩阵有多稀疏?整个空间是相关的吗?它的密度大约为50%。在这种特殊情况下,坐标是X,Y迷宫位置加上方向。因此,虽然一些X、Y位置和方向状态空间位置是可到达的,但由于阻挡墙,许多位置是不可到达的。矩阵的稀疏程度如何?整个空间是相关的吗?它的密度大约为50%。在这种特殊情况下,坐标是X,Y迷宫位置加上方向。因此,虽然某些X、Y位置和方向状态空间位置是可到达的,但由于阻塞墙,许多位置是不可到达的。