두 개의 목록이 있습니다.은 고유 한 쌍 (내가 찾을 수있는 모든 게시물은 쌍 자체에만 관심이 있습니다)과 연결되어 있습니다. 나는 이렇게하기 위해 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_inverse
및 return_index
가에 내장 된 기능을 파이썬 루틴 대표 존재하지 않는 다음과
@moarningsun 아아, 나는 그 질문을 발견했다. 그러나 나는 당신이 특별히 그것을 부를 때까지 그 대답에서'idx'를 보지 못했다. 나는 그곳에있는 대답의 길이와 수에 푹 빠져있는 것 같아. ... – Ajean
특정 답변에 연결하면 좋을 텐데. http://stackoverflow.com/a/16973510/2379410 –