3
我有一個數組A:每一行的最後一個非零元素設爲零 - NumPy的
A = array([[1, 2, 3,4], [5,6,7,0] , [8,9,0,0]])
我想每一行的最後一個非零更改爲0
A = array([[1, 2, 3,0], [5,6,0,0] , [8,0,0,0]])
如何編寫任何n * m numpy數組的代碼? 感謝,S ;-)
我有一個數組A:每一行的最後一個非零元素設爲零 - NumPy的
A = array([[1, 2, 3,4], [5,6,7,0] , [8,9,0,0]])
我想每一行的最後一個非零更改爲0
A = array([[1, 2, 3,0], [5,6,0,0] , [8,0,0,0]])
如何編寫任何n * m numpy數組的代碼? 感謝,S ;-)
方法#1
一種方法基於cumsum
和argmax
-
A[np.arange(A.shape[0]),(A!=0).cumsum(1).argmax(1)] = 0
採樣運行 -
In [59]: A
Out[59]:
array([[2, 0, 3, 4],
[5, 6, 7, 0],
[8, 9, 0, 0]])
In [60]: A[np.arange(A.shape[0]),(A!=0).cumsum(1).argmax(1)] = 0
In [61]: A
Out[61]:
array([[2, 0, 3, 0],
[5, 6, 0, 0],
[8, 0, 0, 0]])
方法2
還有一個基於argmax
,希望更有效 -
A[np.arange(A.shape[0]),A.shape[1] - 1 - (A[:,::-1]!=0).argmax(1)] = 0
說明
之一argmax
的用途之一是獲得第一 occurence所述max
元件的ID沿陣列中的一個軸。在第一種方法中,我們沿着行獲取cumsum並獲取第一個最大ID,它表示最後一個非零元素。這是因爲剩餘元素上的cumsum
不會增加最後一個非零元素之後的總和值。
讓我們重新運行這種情況下,在位更詳細的方式 -
In [105]: A
Out[105]:
array([[2, 0, 3, 4],
[5, 6, 7, 0],
[8, 9, 0, 0]])
In [106]: (A!=0)
Out[106]:
array([[ True, False, True, True],
[ True, True, True, False],
[ True, True, False, False]], dtype=bool)
In [107]: (A!=0).cumsum(1)
Out[107]:
array([[1, 1, 2, 3],
[1, 2, 3, 3],
[1, 2, 2, 2]])
In [108]: (A!=0).cumsum(1).argmax(1)
Out[108]: array([3, 2, 1])
最後,我們使用fancy-indexing
使用這些作爲列索引中A
並設置適當的元素。
在第二種方法中,當我們在布爾數組上使用argmax
時,我們只得到了第一個發生的True
,我們在輸入數組的行翻轉版本上使用了第一種。因此,我們將有最後一個非零元素在原來的順序。其餘的想法是一樣的。
謝謝你,Divakar。 –
你能解釋一下argmax的用法嗎? –
@DOKnow在帖子中增加了幾條評論。 – Divakar