Python 将三维坐标映射到一维索引

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

我有一个三维坐标。我想把它映射到一维索引。据我所知,人们可以使用配对函数来处理二维情况。但是,我为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到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位置和方向状态空间位置是可到达的,但由于阻塞墙,许多位置是不可到达的。