2013-03-12 2 views
4

numpy.where가 true로 평가 된 장소의 수를 찾고 싶습니다. 다음 솔루션이 작동하지만 꽤 못 생깁니다.numpy.where가 반환하는 값의 수를 찾음

b = np.where(a < 5) 
num = (b[0]).shape[0] 

결과 배열을 사용하여 작업을 수행하기 전에 num> 0인지 확인해야하는 언어에서 왔습니다. num을 찾는 것보다 더 우아한 방법이 있습니까? 아니면 num을 찾는 것보다 더 Pythonic 한 솔루션입니까?

(IDL에 익숙한 사람들을 위해, 나는 간단한 b = where(a lt 5, num)을 복제하는 것을 시도하고있다.)

+0

'len (b [0])' – Jaime

답변

6
In [1]: import numpy as np 

In [2]: arr = np.arange(10) 

In [3]: np.count_nonzero(arr < 5) 
Out[3]: 5 

또는

In [4]: np.sum(arr < 5) 
Out[4]: 5 

을 어쨌든 b = np.where(arr < 5)[0]을 정의해야하는 경우, len(b)를 사용 또는 b.size (len()은 조금 더 빨라지지만 성능 측면에서는 거의 동일합니다).

+0

감사합니다. 어쨌든 인덱스 배열이 필요하다는 것을 분명히해야합니다. 나는 num도 필요합니다. 이 점을 감안할 때, 필자가 생각해 낸 해결책은 아마도 당신보다 약간 빠르며 둘 다 익숙한 것보다 많은 코드 라인을 차지합니다. 그러나 나는 또한 대부분의 시간을 점검 할 필요가 없다는 것을 발견했다. 빈 배열을 사용하여 연산 색인을 수행하는 것은 Python에서 허용되며 아무 것도 수행하지 않습니다. 동시에 굉장하고 이상한 어느 쪽입니다. – user2162806

+0

@ user2162806 - 이미'b = np.where (arr <5) [0]'을 사용하고 있다면'len (b)'또는'b.size' ('len') 더 빠르지 만 성능면에서 거의 동일합니다.) – root

0

where 문 조건이 결과가 False로 평가되지 않음을 의미하는 경우에만 작동합니다. 그러나 그것은 쉽게 : 그래서

import numpy as np 
a = np.random.randint(1,11,100) 
a_5 = a[np.where(a>5)] 
a_10 = a[np.where(a>10)] 
a_5.any() #True 
a_10.any() #False 

당신은 물론 당신이 할당하기 전에이 시도 할 수하고자하는 경우 :

a[np.where(a>5)].any() #True 
a[np.where(a>10)].any() #False 
0

또 다른 방법은 당신이 더 당신도 할 수 그것을 좋아한다면

In [14]: a = np.arange(100) 
In [15]: np.where(a > 1000)[0].size > 0 
Out[15]: False 
In [16]: np.where(a > 10)[0].size > 0 
Out[16]: True 
+0

아, 크기보다 모양이 낫습니다 ([0] 필요 없음). 감사. – user2162806

관련 문제