我正在寻找一种在Numpy中线性和多维索引之间进行互换的快速方法.
为了使我的用法具体化,我有一个大的N个粒子集合,每个粒子分配5个浮点值(维度),给出一个Nx5数组.然后,我使用numpy.digitize并使用适当选择的bin边界来对每个维度进行分区,以便为每个粒子分配5维空间中的bin.
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
Run Code Online (Sandbox Code Playgroud)
然后binassign包含与多维索引对应的行.如果我想将多维索引转换为线性索引,我想我会想做类似的事情:
linind = numpy.arange(6**5).reshape(6,6,6,6,6)
Run Code Online (Sandbox Code Playgroud)
这将查找每个多维索引以将其映射到线性索引.然后你可以回去使用:
mindx = numpy.unravel_index(x,linind.shape)
Run Code Online (Sandbox Code Playgroud)
我遇到困难的地方是弄清楚如何在每行中包含多维索引的binassign(Nx5数组),并将其转换为1d线性索引,方法是使用它来切割线性索引数组linind.
如果有人有一个(或几个)行索引技巧在多维索引和线性索引之间来回传递,其方式是对所有N个粒子进行矢量化操作,我将非常感谢您的见解.