numpy.unique дає неправильний вихід для списку наборів


14

У мене є список наборів, наданих,

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

Коли я знаходжу унікальні елементи в цьому списку за допомогою numpy's 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._unique1dфункції від NumPy (див. Код тут ), яка сама використовує .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

Це тому, що набір є непорушним типом

{1} is {1} # will give False

ви можете використовувати python, collections.Counterякщо зможете перетворити набір в кортеж, як показано нижче

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

isтестування не пов'язане з придатністю для придатності. Відсутність придатності не є причиною того, що np.unique () не працює на множинах: відповідно до прийнятої відповіді, відсутність повного впорядкування - це причина. Використання tuple () на множинах не гарантує впорядкування виводу, тому два набори з однаковими елементами можуть бути неправильно перетворені в різні кортежі.
Маріус Гедмінас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.