2012-10-19 2 views
3

나는 n-vectors의 timeseries로 취급하고 싶습니다 모양 (n,t)의 배열을 가지고 있습니다.벡터화 된 방식으로 특정 축에 대한 2D 배열의 고유 벡터를 찾는 방법은 무엇입니까?

고유 한 각 벡터에 대해 t-dimension 및 연관된 t-indices을 따라 고유 한 n-vector 값을 알고 싶습니다. 합리적인 평등 정의를 사용하여 기꺼이 드리겠습니다 (예 : numpy.unique은 수레가 걸립니다)

이것은 파이썬 루프가 t 이상인 경우에 쉽게 처리 할 수 ​​있지만 벡터화 된 접근 방법이 필요합니다.

일부 특수한 경우에는 n-vectors을 스칼라로 접을 수 있습니다 (예 : 1 번째 결과에 numpy.unique 사용). 당신이 boolean을 가지고 있다면 을 (2**k) vector로 vectorized (boolean vector)를 정수로 변환 할 수 있지만, 나는 꽤 일반적인 해결책을 찾고있다.

답변

5

배열의 모양이 (t, n) 인 경우 - 각 n 벡터의 데이터가 메모리에서 연속되도록 - 2 차원 배열의 뷰를 1 차원 구조 배열로 만들 수 있습니다 이보기에서 numpy.unique를 사용하십시오.

배열의 저장 규칙을 변경할 수 있거나 트랜스 포즈 된 배열의 복사본을 만드는 데 문제가 없으면이 방법을 사용할 수 있습니다. 이 유망한 보이지만, 나를 위해 잘 작동을하지 않습니다

import numpy as np 

# Demo data. 
x = np.array([[1,2,3], 
       [2,0,0], 
       [1,2,3], 
       [3,2,2], 
       [2,0,0], 
       [2,1,2], 
       [3,2,1], 
       [2,0,0]]) 

# View each row as a structure, with field names 'a', 'b' and 'c'. 
dt = np.dtype([('a', x.dtype), ('b', x.dtype), ('c', x.dtype)]) 
y = x.view(dtype=dt).squeeze() 

# Now np.unique can be used. See the `unique` docstring for 
# a description of the options. You might not need `idx` or `inv`. 
u, idx, inv = np.unique(y, return_index=True, return_inverse=True) 

print "Unique vectors" 
print u 
+0

:

다음은 예입니다. numpy 버전 1.6.2를 사용하여 예제 코드 (dtype -> np.dtype)를 실행하면 "TypeError : 요청 된 정렬을 사용할 수 없습니다."(아래 참조) 및 실제 문제에서 유사한 논리를 사용하려고 할 때 "ValueError : 배열과 호환되지 않는 새로운 유형"을 얻으십시오. (추적하려고하는데, 그게 예제를 그대로 사용하도록 유도했습니다.) –

+0

어떤 이유로 array.argsort (kind = 'mergesort')는 이러한 유형의 객체에 대해 구현되지 않습니다. kind = 'quicksort'는 잘 작동합니다. 일반적으로 mergesort의 안정적인 정렬이 인덱스 w/duplicates의 관계를 처리하기를 원하는 이유를 알지만, 제 경우에는 quicksort를 사용하여 인덱스를 직접 구축 할 수 있으며 불안정하다는 것에 대해 걱정하지 않아도됩니다. 불행히도 나는 여전히 나의 실제 데이터를보기 위해 (dtype = dt) 작동하도록 노력하고있다. –

+0

내 "새로운 유형이 호환되지 않습니다"라는 오류가 발생했습니다. (필자가 말한 것처럼) "xT = x.transpose()"가 아니라 "xT = x.transpose(). ** copy() **" 둘째로, numpy 1.6.2에서 unique은 인덱스를 반환하도록 요청할 때 mergesort (quicksort보다는)를 사용하고 mergesort 구현은 사용자 정의 dtype을 좋아하지 않습니다. 이 문제를 해결하기 위해 나는 kindle = merge를 제거하는 unique (자기 자신의 uniqueetops.py에있는) 복사본을 만들 수 있습니다. 이것은 내 문제를 해결합니다! 흥미롭게도 n <64의 경우이 코드는 (수작업으로 만든) 벡터로 도트 처리하여 벡터를 입구에 매핑하는 것보다 속도가 더 빠릅니다. –

관련 문제