numpy.unique는 세트 목록에 대해 잘못된 출력을 제공합니다.


14

나는 주어진 세트 목록을 가지고있다.

sets1 = [{1},{2},{1}]

이 목록에서 numpy를 사용하여 고유 한 요소를 찾으면 unique , 나는 얻을

np.unique(sets1)
Out[18]: array([{1}, {2}, {1}], dtype=object)

보다시피 결과는 다음과 같이 잘못되었다 {1} , 출력에서 ​​반복되는 .

비슷한 요소를 인접하게 만들어 입력의 순서를 변경하면 이런 일이 발생하지 않습니다.

sets2 = [{1},{1},{2}]

np.unique(sets2)
Out[21]: array([{1}, {2}], dtype=object)

왜 이런 일이 발생합니까? 아니면 내가 한 방식에 문제가 있습니까?


1
왜 작동하지 않는지 잘 모르겠지만 sets1.sort()목록의 순서를 변경하지 않는 사실과 관련이 있다고 생각 합니다. 난 당신이 함수를 만들 필요가 있다고 생각 f당신이 원하는 기준에 따라 세트를 정렬 한 다음 패스 sets1.sort(key=f)np.unique()
ATK7474

답변:


8

여기서 발생하는 것은 np.unique함수가 자체적으로 메소드를 사용하는 np._unique1dNumPy 의 함수 ( 여기 코드 참조 )를 기반으로 한다는 .sort()것입니다.

이제 각 세트에 하나의 정수만 포함 된 세트 목록을 정렬해도 세트에있는 정수 값에 따라 각 세트 의 목록 이 생성되지 않습니다 . 그래서 우리는 (그리고 우리가 원하는 것이 아닙니다) :

sets = [{1},{2},{1}]
sets.sort()
print(sets)

# > [{1},{2},{1}]
# ie. the list has not been "sorted" like we want it to

이제 지적했듯이 세트 목록이 원하는 방식으로 이미 주문 된 경우 np.unique사전에 목록을 정렬 했으므로 작동합니다.

하나의 특정 솔루션 (각각 단일 정수를 포함하는 세트 목록에서만 작동 함)은 다음과 같습니다.

np.unique(sorted(sets, key=lambda x: next(iter(x))))

-1

set은 해싱 할 수없는 유형이기 때문에

{1} is {1} # will give False

collections.Counter아래와 같이 세트를 튜플로 변환 할 수 있다면 파이썬 을 사용할 수 있습니다

from collections import Counter
sets1 = [{1},{2},{1}]
Counter([tuple(a) for a in sets1])

is테스트는 해시 가능성과 관련이 없습니다. 해시 성의 결여가 np.unique ()가 세트에서 작동하지 않는 이유는 아닙니다. 수용된 답변에 따르면, 총 순서의 부족이 그 이유입니다. 세트에 tuple ()을 사용한다고해서 출력 순서가 보장되는 것은 아니므로 동일한 요소를 가진 두 세트가 다른 튜플로 잘못 변환 될 수 있습니다.
Marius Gedminas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.