numpy.unique fornisce un output errato per l'elenco di set


14

Ho un elenco di set forniti da,

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

Quando trovo gli elementi univoci in questo elenco usando numpy unique, ottengo

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

Come si può vedere, il risultato è sbagliato come {1}si ripete nell'output.

Quando cambio l'ordine nell'input rendendo adiacenti elementi simili, ciò non accade.

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

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

Perché succede? O c'è qualcosa che non va nel mio modo di fare?


1
Non sono sicuro del motivo per cui non funziona, ma sospetto che abbia a che fare con il fatto che sets1.sort()non cambia l'ordine dell'elenco. Penso che sia necessario creare una funzione fper ordinare i set in base ai criteri desiderati, quindi passare sets1.sort(key=f)anp.unique()
ATK7474

Risposte:


8

Quello che succede qui è che la np.uniquefunzione si basa sulla np._unique1dfunzione di NumPy (vedi il codice qui ), che a sua volta utilizza il .sort()metodo.

Ora, l'ordinamento di un elenco di insiemi che contengono un solo numero intero in ciascun set non comporterà un elenco con ciascun set ordinato dal valore dell'intero presente nel set. Quindi avremo (e non è quello che vogliamo):

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

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

Ora, come hai sottolineato, se l'elenco dei set è già ordinato nel modo desiderato, np.uniquefunzionerà (dal momento che avresti ordinato in precedenza l'elenco).

Una soluzione specifica (tuttavia, tieni presente che funzionerà solo per un elenco di insiemi che contengono ciascuno un singolo numero intero) sarebbe quindi:

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

-1

Questo perché set è di tipo non lavabile

{1} is {1} # will give False

puoi usare Python collections.Counterse puoi convertire il set in tupla come di seguito

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

isil test non è correlato all'hashbility. La mancanza di hashability non è la ragione per cui np.unique () non funziona sui set: secondo la risposta accettata, la mancanza di ordinamento totale è quella ragione. L'uso di tuple () sui set non garantisce l'ordinamento dell'output, quindi due set con gli stessi elementi potrebbero erroneamente essere convertiti in tuple diverse.
Marius Gedminas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.