2014-09-05 2 views
2

두 개의 목록이 있습니다.은 고유 한 쌍 (내가 찾을 수있는 모든 게시물은 쌍 자체에만 관심이 있습니다)과 연결되어 있습니다. 나는 이렇게하기 위해 numpy.unique을 사용하려고 노력했지만, 기이 한 일을 당하고있다. 목록을 압축하여 튜플 목록을 만들었습니다. set()np.unique()은 성공적으로 유일한 쌍으로 줄 였지만 원하는 것은 원래 목록에있는 인덱스입니다. unique에 대한 설명서는 return_inverse=True 인 경우이를 반환 함을 나타냅니다. 그러나, 나는 그것이 "평평하게하는 것"의 다른 레벨을 얻고있다.Numpy.unique behavior (불일치의 평탄화)

이 예제에서는 문자열을 사용하여 비교 문제를 피하고 실제로는 부동입니다.

import numpy as np 

l_1 = ['12.34', '12.34', '12.34', '12.34', '56.78', '56.78', '90.12', '90.12'] 
l_2 = ['-1.23', '-1.23', '-4.56', '-4.56', '-6.78', '-6.78', '-9.01', '-9.01'] 
ll = zip(l_1, l_2) 

ull1 = np.unique(ll) 

ull2, inds = np.unique(ll, return_inverse=True) 

첫 번째 경우 쌍은 출력에서 ​​두 번째 차원으로 보존됩니다. 두 번째 경우에도 터플이 평평하게되어 페어를 파괴합니다.

In [1]: ull1 
Out[1]: 
array([['-9.01', '90.12'], 
     ['-1.23', '12.34'], 
     ['-6.78', '56.78'], 
     ['-4.56', '12.34']], 
     dtype='|S5') 

In [2]: ull2 
Out[2]: 
array(['-1.23', '-4.56', '-6.78', '-9.01', '12.34', '56.78', '90.12'], 
     dtype='|S5') 

이 작업은 의도적입니까? unique이 첫 번째 경우에 원하는 인덱스를 제공하는 방법이 있습니까 ([[6,7], [0,1], [4,5], [2,3]]과 같은)? 이전 또는 후자의 행동이 이상한 경우 문서에서 알 수 없습니다.

비슷한 목록의 다른 값을 조작하려면 색인이 필요합니다. 내가 팬더에 접근했다면 나는 그것을 사용할 것이지만, 내가 달려야 만하는 컴퓨터는 아주 오래된 버전의 멍청하고 팬더가 없다. 그러나이 같은 문제는 여전히 numpy 1.8.1에서 발생합니다. 나는 다음과 같은 것을 할 수 있다는 것을 알고있다 :

sll = list(set(ll)) 
for i in range(len(sll)): 
    inds = np.where([val == sll[i] for val in ll]) 
    # I do my operations here using inds 

그러나 나는 더 우아한 것이있을 것이라고 기대하고있다. 입력이 배열이 아닌

try: 
    ar = ar.flatten() 
except AttributeError: 
    if not return_inverse and not return_index: 
     return np.sort(list(set(ar))) 
    else: 
     ar = np.asanyarray(ar).flatten() 

경우와 return_inversereturn_index가에 내장 된 기능을 파이썬 루틴 대표 존재하지 않는 다음과

+0

@moarningsun 아아, 나는 그 질문을 발견했다. 그러나 나는 당신이 특별히 그것을 부를 때까지 그 대답에서'idx'를 보지 못했다. 나는 그곳에있는 대답의 길이와 수에 푹 빠져있는 것 같아. ... – Ajean

+1

특정 답변에 연결하면 좋을 텐데. http://stackoverflow.com/a/16973510/2379410 –

답변

3

버전 numpy.uniquesource code에게 1.8.1 시작 고유 한 요소를 찾으십시오. 그렇게하는 방법은 도청 당한다. documentation이 보장하는 평탄화를 수행하지 않습니다.

입력 배열. 이미 1-D가 아닌 경우 병합됩니다.

Jaime이 의견에서 지적했듯이 현재 NumPy 마스터 분기에서 수정되었습니다.


나는 당신이 structured array로 두 개의 목록을 포장하여 원하는 결과를 얻을 수 있다고 생각합니다. numpy.unique이 구조화 된 배열을 사용하는지 여부는 알 수 없지만 구조화 된 배열을 사용하는 방법을 설명하는 numpy.sort을 사용하여 동작을 복제 할 수 있습니다.

+0

우수!구조화 된 배열에 대해서도 생각조차하지 못했지만 방금 시도 했으므로 원하는대로 정확하게 처리 할 수있었습니다. numpy 문서에 대한 설명을 해 주셔서 감사합니다. 나는 또한 '1-D가 아니라면 평평해질 것입니다.'라는 모순에 혼란 스러웠습니다. – Ajean

+2

그 버그 동작은 잠시 후에 수정되었으며 마스터 소스 코드 [여기 ] (https://github.com/numpy/numpy/blob/master/numpy/lib/arraysetops.py#L96) 또한 1.9 베타 버전입니다. – Jaime

+0

@Jaime : 아, 잘 알고 있습니다. 코드의 개발 버전을 확인하지는 않았습니다. – user2357112