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?
sets1.sort()
tidak mengubah urutan daftar. Saya pikir Anda perlu membuat fungsif
untuk mengurutkan set berdasarkan kriteria apa pun yang Anda inginkan, dan kemudian beralihsets1.sort(key=f)
kenp.unique()
Jawaban:
Apa yang terjadi di sini adalah bahwa
np.unique
fungsi didasarkan padanp._unique1d
fungsi 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):
Sekarang, seperti yang telah Anda tunjukkan, jika daftar set sudah dipesan dengan cara yang Anda inginkan,
np.unique
akan 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:
sumber
Itu karena set adalah tipe yang tidak dapat pecah
Anda dapat menggunakan python
collections.Counter
jika Anda dapat mengonversi set ke tuple seperti di bawah inisumber
is
pengujian 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.