numpy.unique memberikan output yang salah untuk daftar set

14

Saya punya daftar set yang diberikan oleh,

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

Ketika saya menemukan elemen unik dalam daftar ini menggunakan numpy's unique, saya mengerti

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

Seperti dapat dilihat, hasilnya salah seperti {1}diulang dalam output.

Ketika saya mengubah urutan input dengan membuat elemen serupa berdekatan, ini tidak terjadi.

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

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

Mengapa ini terjadi? Atau ada yang salah dengan cara saya lakukan?

terburu-buru
sumber
1
Saya tidak yakin mengapa itu tidak berhasil, tetapi saya menduga itu ada hubungannya dengan fakta yang sets1.sort()tidak mengubah urutan daftar. Saya pikir Anda perlu membuat fungsi funtuk mengurutkan set berdasarkan kriteria apa pun yang Anda inginkan, dan kemudian beralih sets1.sort(key=f)kenp.unique()
ATK7474

Jawaban:

8

Apa yang terjadi di sini adalah bahwa np.uniquefungsi didasarkan pada np._unique1dfungsi dari NumPy (lihat kode di sini ), yang dengan sendirinya menggunakan .sort()metode.

Sekarang, mengurutkan daftar set yang hanya berisi satu integer di setiap set tidak akan menghasilkan daftar dengan setiap set diurutkan berdasarkan nilai integer yang ada di set. Jadi kita akan memiliki (dan bukan itu yang kita inginkan):

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

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

Sekarang, seperti yang telah Anda tunjukkan, jika daftar set sudah dipesan dengan cara yang Anda inginkan, np.uniqueakan berfungsi (karena Anda akan mengurutkan daftar sebelumnya).

Satu solusi spesifik (namun, perlu diketahui bahwa itu hanya akan berfungsi untuk daftar set yang masing-masing berisi bilangan bulat tunggal) akan menjadi:

np.unique(sorted(sets, key=lambda x: next(iter(x))))
Pangeran Berdarah Campuran
sumber
-1

Itu karena set adalah tipe yang tidak dapat pecah

{1} is {1} # will give False

Anda dapat menggunakan python collections.Counterjika Anda dapat mengonversi set ke tuple seperti di bawah ini

from collections import Counter
sets1 = [{1},{2},{1}]
Counter([tuple(a) for a in sets1])
Dev Khadka
sumber
ispengujian tidak terkait dengan hashability. Kurangnya hashability bukan alasan np.unique () tidak bekerja pada set: menurut jawaban yang diterima, kurangnya total pemesanan adalah alasan itu. Menggunakan tuple () pada set tidak menjamin pemesanan output, jadi dua set dengan elemen yang sama mungkin salah dikonversi ke tupel yang berbeda.
Marius Gedminas