我有一个 N 维数组,每个维度都有相同数量的项目(即相同的“长度”)。
给定数组的一维索引,我想要一个返回与该索引关联的坐标的函数。数组的索引方式实际上并不重要(从某种意义上说,数组的所有维度都是相等的,就将在数组上运行的算法而言,没有一个优先级)。
因此,例如,如果我有一个 4x4x4 数组,索引 63 应该返回 [3,3,3],索引 0 应该返回 [0,0,0],索引 5 应该返回 [1,1,0]。
我编写了以下函数,其中 nDim 是维度数,nBin 是每个维度的长度:
def indicesOf(x,nDim,nBin) :
indices = []
for i in arange(0,nDim) :
index = (x/nBin**(i))%nBin
indices.append(index)
x -= index*nBin**i
return indices
它似乎有效——但有没有更有效的方法来进行这种计算?老实说,我有一半“问”这个问题只是为了分享这个解决方案,因为我在网上找不到解决方案。但是,如果有更有效的方法来做到这一点,那就太好了——请分享!
上面的函数是用 python 编写的,但是我只是用它来原型化一个 C(实际上是 CUDA)函数,所以我没有任何 python 精彩的库可供我使用。
这是结合 JackOLantern 和 Eric 对以下两种尺寸的力量的评论的解决方案。它似乎适用于我尝试过的少数测试用例。
def indicesPowOf2(x,nDim,nBin) :
logWidth = math.log(nBin,2)
indices = [0]*nDim
for i in arange(nDim) :
indices[i] = x & (nBin-1)
x = x >> int(logWidth)
return indices