2016-06-16 3 views
1

'ax ​​= 1'옵션과 함께 np.unique와 동일한 값을 얻으려고합니다.numpy를 사용하여 행마다 고유 한 값 ~ 고유 값 얻기

a = np.array([[8, 8, 8, 5, 8], 
     [8, 2, 0, 8, 8], 
     [4, 5, 4, 2, 4], 
     [4, 6, 5, 2, 6]]) 

각 행에서 가장 많은 수의 값을 가져 와서 1D 벡터에 저장하려고합니다. 기본적으로 "각 행에서 가장 많이 볼 수있는 값입니다."

정답 :이 예에서는 [8,8,4,6]입니다. 행 수천 이상 반복 할 때 원하는 결과를 제공하지만, 파이썬에서 매우 느립니다

y = np.zeros(len(a)) 

for i in xrange(len(a)): 
    [u,cnt] = np.unique(a[i,:],return_counts=True) 
    # pick the value from 'u' that is seen the most. 
    y[i] = u[np.argmax(cnt)] 

:

는 지금은 뭔가를하고 있어요. 나는 완전히 벡터화 된 접근법을 찾고있다.

나는 unique row elements 게시물을 찾았지만, 그것은 아주 내가 원하는 걸하지 않습니다 (그리고 하나 내가 원하는 형태로 그것을로 찾으면 정도로 아주 똑똑하지 않다거나 직접 적용 할 수 없습니다.)

가 당신을 감사 제공 할 수있는 도움을 얻기 위해 사전에 준비하십시오.

+0

고유 한 방식으로 원하는대로 벡터화 할 수 없습니다. 행마다 다른 수의 unqiue 요소가있을 수 있으므로 반환 값은 NumPy의 옵션이 아닌 비정형 배열이어야합니다. – Jaime

답변

1

하나의 옵션이 scipy.stats.mode을 사용하는 것입니다

In [36]: from scipy.stats import mode 

In [37]: a 
Out[37]: 
array([[8, 8, 8, 5, 8], 
     [8, 2, 0, 8, 8], 
     [4, 5, 4, 2, 4], 
     [4, 6, 5, 2, 6]]) 

In [38]: vals, counts = mode(a, axis=1) 

In [39]: vals 
Out[39]: 
array([[8], 
     [8], 
     [4], 
     [6]]) 

In [40]: counts 
Out[40]: 
array([[4], 
     [3], 
     [3], 
     [2]]) 

그러나, NumPy와를 사용하여, 입력의 값의 분포에 따라 Python으로 작성, 어떤 빠르게 솔루션보다하지 않을 수 있습니다. 구현은 https://github.com/scipy/scipy/blob/master/scipy/stats/stats.py에서 찾을 수 있습니다 (이 글을 쓰면 여기에 있습니다 : https://github.com/scipy/scipy/blob/master/scipy/stats/stats.py#L372).

함수의 필수 부분은 numpy에만 의존하기 때문에 충분히 잘 작동하지만 scipy에 의존하지 않으려면 함수를 자신의 프로젝트에 복사하면됩니다. scipy가 사용하는 BSD 라이센스 조항. (: 나는 저자 면책 조항)이다

import numpy_indexed as npi 
r = np.indices(a.shape)[0] 
(ua, ur), c = npi.unique((a.flatten(), r.flatten()), return_count=True) 
u, i = npi.group_by(ur).argmax(c) 
y = ua[i] 

, 우리는 첫 번째 '는'자신의 행과 쌍의 값의 고유 한 수를 찾을 수

+0

니스! 예, 훨씬 빠릅니다. 이 속도는 행에 가능한 값의 수에 따라 달라집니다. 10 개의 가능한 값만 포함하는 CIFAR-10을 사용하고 있으므로 10 개의 루프 만 있습니다. 행이 더 많거나 많으면 확장되지 않을 수 있습니다. –

1

A는 완전히 벡터화 솔루션은 numpy_indexed 패키지를 사용하여 구현 될 수있다 그런 다음 각 행 인덱스로 구성된 그룹 내에서 이러한 쌍의 최대 수를 찾으십시오.

'a'에서 가능한 값 10 개만 사용하는 것이 현재 허용되는 답변보다 빠르지는 모르겠지만이 방법의 시간 복잡도는 'a'에 사용 된 비트 수의 함수가 아닙니다. 더 많은 수의 레이블이있는 데이터 세트에서 더 잘 확장되어야합니다.