更快地实现索引数组的循环



我有以下问题:我有带有重复索引的索引数组,并且想向这样的数组添加值:

grid_array[xidx[:],yidx[:],zidx[:]] += data[:]

然而,由于我有重复索引,这并不能正常工作,因为numpy将创建一个临时数组,导致重复索引的数据被分配多次,而不是相互添加(请参阅http://docs.scipy.org/doc/numpy/user/basics.indexing.html)。

适用于类似的环路

for i in range(0,n):
    grid_array[xidx[i],yidx[i],zidx[i]] += data[i]

将是一种缓慢的方式。有没有一种方法我仍然可以使用numpy的矢量化?或者有没有其他方法可以更快地完成任务?

感谢您的帮助

使用bincount怎么样?

import numpy as np
flat_index = np.ravel_multi_index([xidx, yidx, zidx], grid_array.shape)
datasum = np.bincount(flat_index, data, minlength=grid_array.size)
grid_array += datasum.reshape(grid_array.shape)

这是一个缓冲问题。.at提供无缓冲的动作http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.at.html#numpy.ufunc.at

np.add.at(grid_array, (xidx,yidx,zidx),data)

要将数组添加到嵌套数组的元素中,只需执行grid_array[::]+=data:

>>> grid_array=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> data=np.array([3,3,3])
>>> grid_array[::]+=data
>>> grid_array
array([[ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

我想我找到了一个可能的解决方案:

def assign(xidx,yidx,zidx,data):
    grid_array[xidx,yidx,zidx] += data
    return
map(assign,xidx,yidx,zidx,sn.part0['mass'])

最新更新