繁体   English   中英

将一维“展平”索引转换为N维数组的N维矢量索引

[英]Transforming a one-dimensional, “flattened” index into the N-dimensional vector index of an N-dimensional array

我有一个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

您可以避免使用** (幂运算符)来减少计算成本,尤其是当您需要将此代码添加到CUDA内核时。

以下方式可能更有效

void indices(int x, int nDim, int nBin, int indices[]) {
    for(int i=0;i<nDim;i++) {
        indices[i] = x % nBin;
        x /= nBin;
    }
}

如果nBin是2的幂,则可以使用>>&替换/%

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM