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

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

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)

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



답변

여기서 발생하는 것은 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))))


답변

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

{1} is {1} # will give False

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

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


답변