【问题标题】:numpy.unique gives wrong output for list of setsnumpy.unique 为集合列表提供错误的输出
【发布时间】:2021-04-13 02:47:23
【问题描述】:

我有一个由 给出的集合列表,

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)

为什么会发生这种情况?还是我的做法有问题?

【问题讨论】:

  • 我不确定为什么它不起作用,但我怀疑这与sets1.sort() 不会更改列表顺序有关。我认为您需要创建一个函数f 以根据您想要的任何标准对集合进行排序,然后将sets1.sort(key=f) 传递给np.unique()

标签: python list numpy set


【解决方案1】:

这里发生的情况是 np.unique 函数基于 NumPy 中的 np._unique1d 函数(参见代码 here),它本身使用 .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))))

【讨论】:

    【解决方案2】:

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

    {1} is {1} # will give False
    

    如果可以将集合转换为如下所示的元组,则可以使用 python collections.Counter

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

    【讨论】:

    • is 测试与哈希性无关。缺乏哈希性不是 np.unique() 不适用于集合的原因:根据接受的答案,缺乏总排序是原因。在集合上使用 tuple() 并不能保证输出顺序,因此具有相同元素的两个集合可能会错误地转换为不同的元组。
    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2022-11-25
    • 2015-07-06
    相关资源
    最近更新 更多