[python] numpy 배열에서 행 삭제

다음과 같은 배열이 있습니다.

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875,
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]

행 중 하나의 끝에 0 값이 있습니다. 모든 셀에서 0이 아닌 값을 포함하는 모든 행을 유지하면서 0이 포함 된 모든 행을 삭제하고 싶습니다.

그러나 배열은 채워질 때마다 다른 수의 행을 가지며 0은 매번 다른 행에 위치합니다.

다음 코드 줄을 사용하여 각 행에서 0이 아닌 요소의 수를 얻습니다.

NumNonzeroElementsInRows    = (ANOVAInputMatrixValuesArray != 0).sum(1)

위 배열의 경우 다음을 NumNonzeroElementsInRows포함합니다. [5 4]

5는 행 0의 가능한 모든 값이 0이 아님을 나타내고 4는 행 1의 가능한 값 중 하나가 0임을 나타냅니다.

따라서 다음 코드 줄을 사용하여 0 값이 포함 된 행을 찾아 삭제하려고합니다.

for q in range(len(NumNonzeroElementsInRows)):
    if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max():
        p.delete(ANOVAInputMatrixValuesArray, q, axis=0)

그러나 어떤 이유로이 코드는 많은 인쇄 명령을 수행하면 모든 변수가 코드로 이어지는 올바르게 채워지는 것처럼 보임에도 불구하고 아무것도 수행하지 않는 것 같습니다.

“0 값을 포함하는 모든 행을 삭제”하는 쉬운 방법이 있어야합니다.

누구든지 이것을 수행하기 위해 작성해야 할 코드를 보여줄 수 있습니까?



답변

배열에서 행과 열을 삭제하는 가장 간단한 방법은 numpy.delete방법입니다.

다음 배열이 있다고 가정합니다 x.

x = array([[1,2,3],
        [4,5,6],
        [7,8,9]])

첫 번째 행을 삭제하려면 다음과 같이하십시오.

x = numpy.delete(x, (0), axis=0)

세 번째 열을 삭제하려면 다음과 같이하십시오.

x = numpy.delete(x,(2), axis=1)

따라서 0이있는 행의 인덱스를 찾아서 목록이나 튜플에 넣고 이것을 함수의 두 번째 인수로 전달할 수 있습니다.


답변

다음은 하나의 라이너입니다 (예, user333700과 비슷하지만 조금 더 간단합니다).

>>> import numpy as np
>>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],
                [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
>>> print arr[arr.all(1)]
array([[ 0.96488889,  0.73641667,  0.67521429,  0.592875  ,  0.53172222]])

그건 그렇고,이 방법은 큰 행렬의 마스크 배열 방법보다 훨씬 빠릅니다. 2048 x 5 행렬의 경우이 방법은 약 1000 배 더 빠릅니다.

그건 그렇고, user333700의 방법 (그의 의견에서)은 내 테스트에서 약간 더 빨랐지만 그 이유는 내 마음을 흔들어 놓았습니다.


답변

이것은 원래 접근 방식과 유사하며 unutbu의 답변 보다 적은 공간을 사용 하지만 느릴 것이라고 생각합니다.

>>> import numpy as np
>>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]])
>>> p
array([[ 1.5,  0. ],
       [ 1.4,  1.5],
       [ 1.6,  0. ],
       [ 1.7,  1.8]])
>>> nz = (p == 0).sum(1)
>>> q = p[nz == 0, :]
>>> q
array([[ 1.4,  1.5],
       [ 1.7,  1.8]])

그건 그렇고, 당신의 라인 p.delete()은 나를 위해 작동하지 않습니다- 속성 ndarray이 없습니다 .delete.


답변

numpy는 똑같은 작업을 수행하는 간단한 함수를 제공합니다. 마스킹 된 배열 ‘a’가 있다고 가정하고 numpy.ma.compress_rows (a)를 호출하면 마스킹 된 값이 포함 된 행이 삭제됩니다. 이쪽이 훨씬 빠른 것 같아요 …


답변

import numpy as np
arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],[ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
print(arr[np.where(arr != 0.)])


답변

이 질문에 답하기에는 너무 늦었지만 커뮤니티를 위해 제 의견을 공유하고 싶었습니다. 이 예에서는 행렬 ‘ANOVA’라고 부르겠습니다.이 행렬에서 5 번째 열에 만 0이있는 행을 제거하려고한다고 가정합니다.

indx = []
for i in range(len(ANOVA)):
    if int(ANOVA[i,4]) == int(0):
        indx.append(i)

ANOVA = [x for x in ANOVA if not x in indx]


답변