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,19年

Answers:


8

这里发生的是该np.unique函数基于np._unique1dNumPy 的函数(请参见此处的代码),该函数本身使用该.sort()方法。

现在,对每个集合中仅包含一个整数的集合列表进行排序将不会导致每个集合按集合中存在的整数值排序的列表。因此,我们将拥有(这不是我们想要的):

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它将起作用(因为您已经预先对列表进行了排序)。

那么一个特定的解决方案(尽管请注意,它仅适用于每个包含单个整数的集合的列表):

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

-1

那是因为set是不可散列的类型

{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()不能保证输出排序,因此具有相同元素的两个集合可能会错误地转换为不同的元组。
Marius Gedminas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.