簡體   English   中英

使索引數組的循環更快

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM