簡體   English   中英

提高NumPy陣列上的操作性能

[英]Improving performance of operations on a NumPy array

我正在使用numpy.delete從while循環內的數組中刪除元素。 僅當數組不為空時,此while循環才有效。 此代碼工作正常,但當數組超過1e6元素時,速度會大大降低。 這是一個例子:

while(array.shape[0] > 0):
     ix = where((array >= x) & (array <= y))[0]
     array = delete(array,ix,None)

我試圖使這個代碼有效,但我找不到一個加速while循環的好方法。 我認為,這里的瓶頸是必須包含某種副本的刪除。 我已經嘗試使用蒙面數組以避免復制,但我不擅長python和掩碼數組不是那么容易搜索。 有沒有一種好的,快速的方法來使用刪除或替換它,以便7e6元素可以通過上面的循環處理而不需要24小時?

謝謝

因此,您可以通過以下方式大幅提高代碼的性能:

  • 消除循環;

  • 避免刪除操作(導致原始數組的副本)

NumPy 1.7推出了一款比原版更容易使用的新面膜; 它的性能也好得多,因為它是NumPy核心數組對象一部分 我認為這可能對您有用,因為通過使用它可以避免昂貴的刪除操作

換句話說,不是刪除你不想要的數組元素,而只是掩蓋它們。 這已在其他答案中提出,但我建議使用新的面具

使用NA,只需導入NA

>>> from numpy import NA as NA

然后對於給定的數組,將maskna標志設置為True

>>> A.flags.maskna = True

或者,大多數數組構造函數(從1.7開始)都有參數maskna,您可以將其設置為True

>>> A[3,3] = NA

array([[7, 5, 4, 8, 4],
       [2, 4, 3, 7, 3],
       [3, 1, 3, 2, 1],
       [8, 2, 0, NA, 7],
       [0, 7, 2, 5, 5],
       [5, 4, 2, 7, 4],
       [1, 2, 9, 2, 3],
       [7, 5, 1, 2, 9]])

>>> A.sum(axis=0)
array([33, 30, 24, NA, 36])

通常這不是你想要的 - 也就是說,你仍然希望該列的總和與NA一樣被視為0:

要獲得該行為,請為skipma參數傳入True (大多數NumPy數組構造函數在NumPy 1.7中具有此參數):

>>> A.sum(axis=0, skipna=True)
array([33, 30, 24, 33, 36])

總而言之,為了加速代碼,消除循環並使用新的掩碼:

>>> A[(A<=3)&(A<=6)] = NA

>>> A
array([[8, 8, 4, NA, NA],
       [7, 9, NA, NA, 8],
       [NA, 6, 9, 5, NA],
       [9, 4, 6, 6, 5],
       [NA, 6, 8, NA, NA],
       [8, 5, 7, 7, NA],
       [NA, 4, 5, 9, 9],
       [NA, 8, NA, 5, 9]])

NA占位符 - 在這種情況下 - 表現得像0,我相信你想要的:

>>> A.sum(axis=0, skipna=True)
array([32, 50, 39, 32, 31])

如果我錯了,請糾正我,但我認為你可以做到:

mask=np.where((array >= x) & (array <= y),True,False)
array=array[mask]

並放棄整個循環?

另外,在我的解釋器中, array >= x & array <= y會產生異常。 你可能意味着: (array >= x) & (array <= y)

根據numpy.delete的文檔,該函數返回輸入數組的副本,其中刪除了指定的元素。 因此,復制的數組越大,函數的速度就越慢。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html

為什么你需要經常刪除數組的塊? 如果您的數組非常動態,那么最好使用list來存儲數組的各個部分,並且一次只能在較小的位上進行刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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