numpy.uniqueがセットのリストに誤った出力を与える


14

私は与えられたセットのリストを持っています、

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

私はnumpyののを使用して、このリストの中にユニークな要素を見つけたとき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._unique1dNumPyからの関数(ここのコードを参照)に基づいており、それ自体が.sort()メソッドを使用しています。

現在、各セットに整数が1つだけ含まれているセットのリストをソートしても、セット内に存在する整数の値によって各セット並べ替えられたリストにはなりません。したがって、次のようになります(これは私たちが望んでいることではありません)。

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(あなたは前もってリストをソートしていたので)動作します。

1つの特定のソリューション(ただし、それぞれが単一の整数を含むセットのリストに対してのみ機能することに注意してください)は次のようになります。

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

-1

これは、セットがハッシュできないタイプであるためです

{1} is {1} # will give False

collections.Counter以下のようにセットをタプルに変換できる場合は、pythonを使用できます

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

isテストはハッシュ可能性とは無関係です。ハッシュ可能性の欠如は、np.unique()がセットに対して機能しない理由ではありません。受け入れられた回答によれば、全体の順序付けの欠如がその理由です。セットでtuple()を使用しても出力の順序は保証されないため、同じ要素を持つ2つのセットが異なるタプルに誤って変換される可能性があります。
Marius Gedminas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.