在包含"datetime"(Python/Numpy)的对象列表中使用"np.unique



我试图在两个python对象之间使用np.setdiff1d,但无法管理。我发现我不能在包含日期时间的对象列表中使用np.union

再现错误:

import numpy as np
from datetime import datetime
d = datetime.now()
a = [(1, d), (2, d), (3, d), (3, d)]
np.unique(a)

这会引发以下错误:

File "<ipython>", line 6, in <module>
np.unique(a)
File "/usr/local/lib/python3.6/dist-packages/numpy/lib/arraysetops.py", line 264, in unique
ret = _unique1d(ar, return_index, return_inverse, return_counts)
File "/usr/local/lib/python3.6/dist-packages/numpy/lib/arraysetops.py", line 312, in _unique1d
ar.sort()
TypeError: '<' not supported between instances of 'datetime.datetime' and 'int'

这是来自numpy的bug吗?你知道有没有其他方法可以解决我想做的事情(最初愿意使用np.setdiff1d between 2 lists of a similar structure(?

提前,谢谢!!

原因如下:numpy.unique将首先使数组变平。来自文件:

输入数组。除非指定了轴,否则如果它还不是1-D,它将被展平。

所以,你必须考虑你希望元素沿着哪个轴是唯一的(对于NumPy,你的元组列表看起来像2D数组(;则使用正确的CCD_ 5关键字值。不幸的是,你很快就会发现这也不起作用,因为元素被视为一个对象(因为NumPy试图将整数和日期时间混合到一个对象类型中(,而在NumPy中不允许进行比较。

但是,由于您使用的是元组列表(没有NumPy(,只需使用set():

>>> from datetime import datetime
>>>
>>> d = datetime.now()
>>> a = [(1, d), (2, d), (3, d), (3, d)]
>>> set(a)
{(2, datetime.datetime(2019, 11, 1, 17, 15, 38, 578611)), (1, datetime.datetime(2019, 11, 1, 17, 15, 38, 578611)), (3, datetime.datetime(2019, 11, 1, 17, 15, 38, 578611))}

请注意,集合是自然无序的。

最新更新