[英]Making for loop with index arrays faster
我有以下問題:我有重復索引的索引數組,並希望像這樣向數組添加值:
grid_array[xidx[:],yidx[:],zidx[:]] += data[:]
但是,由於我重復索引,因此它不能正常工作,因為numpy會創建一個臨時數組,導致重復索引的數據被分配多次而不是相互添加(參見http://docs.scipy .org / doc / numpy / user / basics.indexing.html )。
像for循環一樣
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'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.