2014-05-18 1 views
11

numpy 행렬 M이 있습니다. 행렬의 행 중 일부는 모든 요소가 0이고 해당 행의 인덱스를 가져와야합니다. 내가 고려하고있는 순진한 접근법은 행렬의 각 행을 반복하고 각 요소를 확인하는 것입니다. 그러나 numpy을 사용하여이를 수행하는 더 빠르고 더 빠른 접근 방법이 있다고 생각합니다. 네가 도울 수 있기를 바란다.numpy가있는 행렬에서 모든 요소가 0으로 지정된 행 찾기

답변

16

한 가지 방법이 있습니다. import numpy as np을 사용하여 numpy를 가져온 것으로 가정합니다.

In [20]: a 
Out[20]: 
array([[0, 1, 0], 
     [1, 0, 1], 
     [0, 0, 0], 
     [1, 1, 0], 
     [0, 0, 0]]) 

In [21]: np.where(~a.any(axis=1))[0] 
Out[21]: array([2, 4]) 

은이 답변에 약간의 변화는 다음과 같습니다 How to check that a matrix contains a zero column?

여기에 무슨 일이 일어나고 있는지의 :

any 방법은 배열의 값은 "truthy"인 경우 True를 반환합니다. 0이 아닌 수는 True로 간주되고 0은 False로 간주됩니다. 인수 axis=1을 사용하여 메소드가 각 행에 적용됩니다. 예 a를 들어, 우리는이 :

In [32]: a.any(axis=1) 
Out[32]: array([ True, True, False, True, False], dtype=bool) 

그래서 각 값은 해당 행이 0이 아닌 값을 포함하고 있는지 여부를 나타냅니다. ~ 연산자는 이진 "없습니다"또는 보완 :

In [33]: ~a.any(axis=1) 
Out[33]: array([False, False, True, False, True], dtype=bool) 

(. 같은 결과를 제공하는 다른 표현이 (a == 0).all(axis=1)입니다)

행 인덱스를 얻으려면, 우리는 where 기능을 사용합니다. 이 인수가 True 인 인덱스를 반환 where은 하나의 배열을 포함하는 튜플을 반환

In [34]: np.where(~a.any(axis=1)) 
Out[34]: (array([2, 4]),) 

하는 것으로. where은 n 차원 배열에서 작동하므로 항상 튜플을 반환합니다. 우리는 그 튜플에 단일 배열을 원합니다.

In [35]: np.where(~a.any(axis=1))[0] 
Out[35]: array([2, 4]) 
+0

정말 멋진 답변입니다. 감사합니다. – holografix

관련 문제