python - numpy.unique 对 numpy.array 的对象表现得很奇怪

标签 python numpy

此问题与“numpy.unique generates a list unique in what regard?”相关(但不相同)

设置:

import numpy as np
from functools import total_ordering

@total_ordering
class UniqueObject(object):
    def __init__(self, a):
        self.a = a
    def __eq__(self, other):
        return self.a == other.a
    def __lt__(self, other):
        return self.a < other.a
    def __hash__(self):
        return hash(self.a)
    def __str__(self):
        return "UniqueObject({})".format(self.a)
    def __repr__(self):
        return self.__str__()

np.unique 的预期行为:

>>> np.unique([1, 1, 2, 2])
array([1, 2])
>>> np.unique(np.array([1, 1, 2, 2]))
array([1, 2])
>>> np.unique(map(UniqueObject, [1, 1, 2, 2]))
array([UniqueObject(1), UniqueObject(2)], dtype=object)

这没问题,它可以工作。但这并不像预期的那样工作:

>>> np.unique(np.array(map(UniqueObject, [1, 1, 2, 2])))
array([UniqueObject(1), UniqueObject(1), UniqueObject(2), UniqueObject(2)], dtype=object)

为什么带有 dtype=object 的 np.array 与带有对象的 python 列表的处理方式不同?

即:

objs = map(UniqueObject, [1, 1, 2, 2])
np.unique(objs) != np.unique(np.array(objs)) #?

我正在运行 numpy 1.8.0.dev-74b08b3Python 2.7.3

最佳答案

按照np.unique的源码,好像真正走的分支是

else:
    ar.sort()
    flag = np.concatenate(([True], ar[1:] != ar[:-1]))
    return ar[flag]

它只是对术语进行排序,然后取与前一个不相等的那些。但这不应该起作用吗?..哎呀。这是在我身上。您的原始代码定义了 __ne__,我在删除被 total_ordering 编辑的比较时不小心删除了它。

>>> UniqueObject(1) == UniqueObject(1)
True
>>> UniqueObject(1) != UniqueObject(1)
True

__ne__ 放回:

>>> UniqueObject(1) != UniqueObject(1)
False
>>> np.array(map(UniqueObject, [1,1,2,2]))
array([UniqueObject(1), UniqueObject(1), UniqueObject(2), UniqueObject(2)], dtype=object)
>>> np.unique(np.array(map(UniqueObject, [1,1,2,2])))
array([UniqueObject(1), UniqueObject(2)], dtype=object)

关于python - numpy.unique 对 numpy.array 的对象表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400979/

相关文章:

python - Sentry:发送速率限制错误以防止错误配额耗尽

python - 如何使用 boto3 获取 aws 中存在的实例和卷以及负载均衡器的总数?

python - 为什么 scipy 和 numpy fft 图看起来不同?

python - 如何使用 OpenCV 在 Python 中将单个 BGR 数组转换为 HSV 数组?

python - 将 numpy/scipy 链接到串行 ATLAS

python - 如何隐藏 tkinter ttk.Notebook 小部件中的整个选项卡栏?

python - 基于时间戳间隔的求和频率

python - ip地址和mac地址的正则表达式

python pandas np.where 来自另一列的值

python - 获取 N 维 numpy 数组中第一次出现的值