numpy.unique kümeler listesi için yanlış çıktı veriyor


14

Tarafından verilen setler listem var,

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

Bu listedeki benzersiz öğeleri numpy kullanarak uniquebulduğumda,

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

Görüldüğü gibi {1}çıktıda tekrarlanan sonuç yanlıştır .

Benzer elemanları bitişik yaparak girişteki sıralamayı değiştirdiğimde bu olmaz.

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

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

Bu neden oluyor? Yoksa yaptığım şekilde yanlış bir şey mi var?


1
Neden işe yaramadığından emin değilim, ancak sets1.sort()listenin sırasını değiştirmeyen gerçeği ile ilgili olduğundan şüpheleniyorum . fSetleri istediğiniz ölçütlere göre sıralamak için bir işlev oluşturmanız ve daha sonra sets1.sort(key=f)np.unique()
geçmeniz

Yanıtlar:


8

Burada yapılan budur ki np.uniquefonksiyon dayanmaktadır np._unique1dnumpy dan fonksiyonu (kod bakın burada kendisi kullanır,) .sort()yöntemini.

Şimdi, her sette sadece bir tam sayı içermelidir setleri listesini sıralama olmaz sette tamsayı mevcut değerinin ait her set ile bir liste ile sonuçlanır. Yani sahip olacağız (ve istediğimiz bu değil):

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

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

Şimdi, işaret ettiğiniz gibi, setlerin listesi zaten istediğiniz şekilde sipariş edilirse, np.unique(listeyi önceden sıraladığınızdan) çalışacaktır.

Belirli bir çözüm (yine de, yalnızca her birinin tek bir tamsayı içeren kümelerin bir listesi için çalışacağını unutmayın):

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

-1

Bunun nedeni setin paylaşılamayan tür olması

{1} is {1} # will give False

Eğer collections.Counterseti aşağıdaki gibi tuple'e dönüştürebiliyorsanız python kullanabilirsiniz

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

istest edilebilirlik ile ilgisi yoktur. Yaşanabilirlik eksikliği np.unique () 'in setler üzerinde çalışmamasının nedeni değildir: kabul edilen cevaba göre, toplam sipariş eksikliği bu nedendir. Setlerde tuple () kullanılması çıktı sırasını garanti etmez, bu nedenle aynı elemanlara sahip iki set yanlış bir şekilde farklı tuples'e dönüştürülebilir.
Marius Gedminas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.