2016-10-10 84 views

回答

5

方法#1

一種方法基於cumsumargmax -

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,我們在輸入數組的行翻轉版本上使用了第一種。因此,我們將有最後一個非零元素在原來的順序。其餘的想法是一樣的。

+0

謝謝你,Divakar。 –

+0

你能解釋一下argmax的用法嗎? –

+0

@DOKnow在帖子中增加了幾條評論。 – Divakar