我正在寻找一种快速的方法,在Numpy中实现线性和多维索引之间的相互转换。在
为了使我的用法具体化,我有大量的N个粒子的集合,每个粒子都分配了5个浮点值(维度),给出一个Nx5数组。然后我用数字化通过适当选择的料仓边界,在5维空间中为每个粒子指定一个料仓。在
N = 10
ndims = 5
p = numpy.random.normal(size=(N,ndims))
for idim in xrange(ndims):
bbnds[idim] = numpy.array([-float('inf')]+[-2.,-1.,0.,1.,2.]+[float('inf')])
binassign = ndims*[None]
for idim in xrange(ndims):
binassign[idim] = numpy.digitize(p[:,idim],bbnds[idim]) - 1
然后binassign包含与多维索引相对应的行。如果我想把多维索引转换成线性索引,我想我应该做如下事情:
^{pr2}$这将为每个多维索引提供一个查找,以将其映射到一个线性索引。然后您可以使用:
mindx = numpy.unravel_index(x,linind.shape)
我遇到的困难是如何获取每行中包含多维索引的binassign(Nx5数组),并将其转换为1d线性索引,方法是使用它对线性索引数组linend进行切片。在
如果有人有一个(或多个)行索引技巧,可以在多维索引和线性索引之间来回切换,从而将所有N个粒子的操作矢量化,我将非常感谢您的见解。在
虽然我非常喜欢EOL的回答,但我想把它概括为每个方向上不均匀数量的箱子,并强调C和F排序风格之间的差异。下面是一个示例解决方案:
现在进行转换
^{pr2}$检查正确性:
为了完整起见,如果您想以快速、矢量化的方式从1d索引返回多维索引:
再次检查:
您可以简单地计算每个箱子的索引:
标量积只需做1*x0+5*x1+5*5*x2+…这通过NumPy的
dot()
非常有效地完成。在相关问题 更多 >
编程相关推荐