2014-10-02 1 views
10

numpy에서 2 차원 배열의 모든 행이 동일하면 테스트하는 방법이 좋은가요?numpy에서 모든 행이 같은지 테스트하는 방법

나는이 추악하고 아마도 또한 느린하는 NumPy와 배열을 파이썬 목록을 혼합 것으로 보인다

np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))]) 

과 같은 작업을 수행 할 수 있습니다.

더 좋은 방법이 있습니까? 숫자 배열의 고유 항목이 1 경우 경우

+1

[비슷한 질문] (http://stackoverflow.com/q/14859458/2988730)에 대해 말했듯이, 이것은 실제와 같은 크기의 임시 배열을 생성하지 않는 적절한 해결책이 필요합니다. 여기뿐만 아니라 여기에 대한 답도). 내가 numpy에 추가하게되면 나는 대답을 게시 할 것이다. –

답변

11

한 가지 방법은하는 것입니다 때문에 당신이 발전기 식으로 파이썬의 all()를 사용하는 경우 더 나은 것 그 대신에, 버전에서 일어나는 어떤 단락이 없다는 것을에 배열의 모든 행에서 첫 번째 행을 빼고 각 항목이 동일 0에 있는지 확인 :

>>> a = np.arange(9).reshape(3, 3) 
>>> b = np.ones((3, 3)) 
>>> ((a - a[0]) == 0).all() 
False 
>>> ((b - b[0]) == 0).all() 
True 

이 더 빨리 더 큰 배열에 대해 고유 한 행을 식별하는 것보다 수 있습니다 becaus e는 필요한 많은 수의 비교를 피합니다. 동일한 기본 개념을 이용한

약간 빠른 방법이다

(arr == arr[0]).all() 

arr 즉, 각 행의 arr의 첫 번째 행 같다고 확인.

+0

이것이 가장 빠른 방법이라고 생각합니다. 고맙습니다. – eleanora

+2

차이의 0과 동일하지 않고 평등을 확인하면 속도가 빨라질 수 있습니다. – Jaime

+0

'(np.diff (b, 1) == 0) .all()'은 어떨까요? – farenorth

5

는 간단히 확인 :

>>> arr = np.array([[1]*10 for _ in xrange(5)]) 
>>> len(np.unique(arr)) == 1 
True 

unutbu의 answer에서 영감을 해결책 : 코드

>>> arr = np.array([[1]*10 for _ in xrange(5)]) 
>>> np.all(np.all(arr == arr[0,:], axis = 1)) 
True 

하나의 문제 np.all()을 적용하기 전에 먼저 전체 목록을 만드는 것입니다.

타이밍 비교 :

>>> M = arr = np.array([[3]*100] + [[2]*100 for _ in xrange(1000)]) 
>>> %timeit np.all(np.all(arr == arr[0,:], axis = 1)) 
1000 loops, best of 3: 272 µs per loop 
>>> %timeit (np.diff(M, axis=0) == 0).all() 
1000 loops, best of 3: 596 µs per loop 
>>> %timeit np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))]) 
100 loops, best of 3: 10.6 ms per loop 
>>> %timeit all(np.array_equal(M[0], M[i]) for i in xrange(1,len(M))) 
100000 loops, best of 3: 11.3 µs per loop 

>>> M = arr = np.array([[2]*100 for _ in xrange(1000)]) 
>>> %timeit np.all(np.all(arr == arr[0,:], axis = 1)) 
1000 loops, best of 3: 330 µs per loop 
>>> %timeit (np.diff(M, axis=0) == 0).all() 
1000 loops, best of 3: 594 µs per loop 
>>> %timeit np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))]) 
100 loops, best of 3: 9.51 ms per loop 
>>> %timeit all(np.array_equal(M[0], M[i]) for i in xrange(1,len(M))) 
100 loops, best of 3: 9.44 ms per loop 
+0

나는 ajcr의 대답이 훨씬 빠르다고 생각한다! – eleanora

+2

@ user2179021 그것은 제 시스템에서'650 μs '를 사용하고 있습니다. 그래서 제 두 번째 대답보다 여전히 느립니다. –

+0

동의 - 두 번째 방법은 내 시스템보다 빠릅니다. –

관련 문제