2016-10-10 1 views
3

을 내가 배열 A를 가지고 :0으로 각 행의 마지막 비 - 제로 요소를 설정 - 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 배열에 대한 코드를 작성하는 방법? 감사합니다, cumsumargmax에 따라 S ;-)

답변

5

접근 # 1

한 가지 방법 -

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의 용도

하나는 max 요소의 선두로부터의 ID를 얻는 것입니다 배열의 축을 따라. 첫 번째 접근법에서는 행을 따라 cumsum을 가져 와서 마지막 0이 아닌 elem을 나타내는 첫 번째 최대 ID를 얻습니다. 이것은 나머지 요소의 cumsum이 마지막 0이 아닌 요소 다음에 합계 값을 증가시키지 않기 때문입니다.

하자 다시 실행 비트의 경우 더 자세한 방법 -

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]) 

마지막으로, 우리는 A에 적절한 요소를 설정하는 열 인덱스와 같은 사람들을 사용하는 fancy-indexing를 사용합니다.

부울 배열에서 argmax을 사용할 때 입력 배열의 행 뒤집기 버전에서 사용한 True의 첫 번째 발생이 발생합니다. 따라서 원래의 순서대로 0이 아닌 마지막 엘레멘트를 갖게됩니다. 거기 아이디어의 나머지는 동일 하.

+0

감사합니다. Divakar. –

+0

argmax의 사용법을 설명 할 수 있습니까 ?? –

+0

@DOKnow 게시물에 몇 가지 의견을 추가했습니다. – Divakar