접근 # 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이 아닌 마지막 엘레멘트를 갖게됩니다. 거기 아이디어의 나머지는 동일 하.
감사합니다. Divakar. –
argmax의 사용법을 설명 할 수 있습니까 ?? –
@DOKnow 게시물에 몇 가지 의견을 추가했습니다. – Divakar