2013-02-13 3 views
15

numpy 배열/행렬의 열에있는 모든 값이 동일한 지 확인하고 싶습니다. 는 내가 ufuncequalreduce을 사용하려고하지만, 모든 경우에 작동하지 않습니다numpy 행렬의 열에있는 값이 모두 같은지 확인하는 방법은 무엇입니까?

In [55]: a = np.array([[1,1,0],[1,-1,0],[1,0,0],[1,1,0]]) 

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

In [57]: np.equal.reduce(a) 
Out[57]: array([ True, False, True], dtype=bool) 

In [58]: a = np.array([[1,1,0],[1,0,0],[1,0,0],[1,1,0]]) 

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

In [60]: np.equal.reduce(a) 
Out[60]: array([ True, True, True], dtype=bool) 

왜 두 번째 경우에 중간 열은 또한 True로 평가 않습니다, 그것은 False을해야하는 동안?

도움 주셔서 감사합니다.

In [47]: np.all(a == a[0,:], axis = 0) 
Out[47]: array([ True, False, True], dtype=bool) 

:

In [46]: a == a[0,:] 
Out[46]: 
array([[ True, True, True], 
     [ True, False, True], 
     [ True, False, True], 
     [ True, True, True]], dtype=bool) 

열에 해당 열의 모든 값에 해당하는 경우 공통 값을 공유한다 :

+1

이 문제는 잠시 동안 나를 괴롭 히고 있습니다. @ Ubuntu의 솔루션은 충분히 우아하지만, 이것을 4096 ** 3 double 배열로 돌리면 어떤 메모리를 남긴 부울 배열을 얻을 수있는 것은 그리 즐겁지 않습니다. 나는'np.equal (a, a [:, 0, None])'을 사용하여 순수한 Python 구현물을 가지고 놀고 있었지만, 같은 문제로 끝난다. 그러므로 나는 이런 종류의 상황을 정확히 다루기 위해 numpy에 대한 새로운 함수'np.same'을 추가하기위한 PR 작업을하고 있습니다. –

답변

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

첫 번째 행에 해당하는 값으로 각각의 값을 비교해

np.equal.reduce의 문제점은에 적용될 때 일어나는 일을 미세 분석하여 알 수 있습니다.:

In [49]: np.equal.reduce([1, 0, 0, 1]) 
Out[50]: True 

처음 두 항목 10 평등에 대한 테스트 결과는 False입니다 :

In [51]: np.equal.reduce([False, 0, 1]) 
Out[51]: True 
이제

False0 평등에 대한 테스트 결과는 True입니다 :

In [52]: np.equal.reduce([True, 1]) 
Out[52]: True 

그러나 True과 1은 동일하므로 총 결과는 True이며 원하는 결과는 아닙니다.

문제는 np.all과 같은 "글로벌"테스트가 필요한 반면 reduce은 "로컬"결과를 누적하려고 시도한다는 것입니다.

+0

좋은 답변입니다. 마스크 배열을 만들지 않고 큰 배열에 대해 이와 같은 작업을 수행 할 수있는 방법이 있습니까? 그것은'감소 '를 사용하는 OP의 초기 호소 였음에 틀림 없다. –

+1

tempory (boolean) 배열없이 결과를 생성 할 수있는 NumPy 메소드에 대해 알지 못합니다. 매우 큰 배열로 작업하고 메모리가 인 경우 배열을 "덩어리 (chunk)"하여 조각 (예 : N 개의 행으로 구성된 배열)으로 만들고 각 조각을 개별적으로 테스트 할 수 있습니다. 그런 다음 조각을 조합하고 테스트하여 결과를 집계합니다. – unutbu

+1

[numpy.memmap] (http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.memmap.html), 또는 [Pytables] (디스크에 큰 배열을 저장하기 위해 을 찾으려면 http://www.pytables.org/) 또는 [h5py] (http://www.h5py.org/)를 방문하십시오. 배열을 한 번에 추출하여 사용할 수 있습니다. 전체 배열을 메모리에 저장할 필요없이 시간을 절약 할 수 있습니다. 그런 식으로 임시 배열 NumPy (일반적으로)에 더 많은 공간이 필요할 수 있습니다. – unutbu

7

을 감안할 때 우분투의 멋진 설명, 당신은 당신의 문제를 해결하기 위해 reduce를 사용할 수 있지만 bitwise_andbitwise_or보다는 equal에 적용해야합니다. 결과적으로,이 부동 소수점 배열 작동하지 않습니다

In [60]: np.bitwise_and.reduce(a) == a[0] 
Out[60]: array([ True, False, True], dtype=bool) 

In [61]: np.bitwise_and.reduce(b) == b[0] 
Out[61]: array([ True, False, True], dtype=bool) 

을 기본적으로, 당신이 열에서 각 요소의 비트를 비교한다. 동일한 비트는 변경되지 않습니다. 다른 비트는 0으로 설정됩니다. 이 방법은 1 비트 대신 0을 가진 숫자는 감소 된 값을 변경합니다. bitwise_and하지 않습니다 트랩 비트가 도입보다는 제거하는 경우 :

In [62]: c = np.array([[1,0,0],[1,0,0],[1,0,0],[1,1,0]]) 

In [63]: c 
Out[63]: 
array([[1, 0, 0], 
     [1, 0, 0], 
     [1, 0, 0], 
     [1, 1, 0]]) 

In [64]: np.bitwise_and.reduce(c) == c[0] 
Out[64]: array([ True, True, True], dtype=bool) 

두 번째 coumn은 분명히 잘못된 것입니다.우리는 함정 새로운 비트 bitwise_or를 사용해야합니다 :

In [66]: np.bitwise_or.reduce(c) == c[0] 
Out[66]: array([ True, False, True], dtype=bool) 

최종 답변

In [69]: np.logical_and(np.bitwise_or.reduce(a) == a[0], np.bitwise_and.reduce(a) == a[0]) 
Out[69]: array([ True, False, True], dtype=bool) 

In [70]: np.logical_and(np.bitwise_or.reduce(b) == b[0], np.bitwise_and.reduce(b) == b[0]) 
Out[70]: array([ True, False, True], dtype=boo 

In [71]: np.logical_and(np.bitwise_or.reduce(c) == c[0], np.bitwise_and.reduce(c) == c[0]) 
Out[71]: array([ True, False, True], dtype=bool) 

이 방법은 더 제한하고 all를 사용 ubunut의 제안보다 우아하지만하지 않는 장점이있다 입력이 엄청나다면 엄청난 임시 배열을 생성합니다. 임시 배열은 행렬의 첫 번째 행만큼 커야합니다. 배열은 0과 1이 포함되어 있기 때문에

Q/Athe bug I filed with numpy이를 바탕으로 편집

만 제공하는 솔루션은 작동합니다. 결과적으로 이 1이고 -1이 아니기 때문에 표시된 작업은 0 또는 1 만 반환 할 수 있습니다. numpy가 정해지고 그 답이 유효 해지기를 바라는이 대답을 지키고 있습니다. 사실 곧 NumPy와 수의 변화가있을 것 같은

편집

보인다. 물론 bitwise_and.identity으로, 그리고 가능하면 선택적 매개 변수를 줄여야합니다.

편집

좋은 소식 모두. np.bitwise_and에 대한 ID는 1.12.0에서 -1으로 설정되었습니다.

관련 문제