我试图在两个python对象之间使用np.setdiff1d,但无法管理。我发现不能对包含datetime的对象列表使用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)?
提前说,谢谢!
发布于 2019-11-02 00:16:30
原因如下:numpy.unique将首先展平数组。从文档中:
输入数组。除非指定了axis,否则如果它还不是1-D,它将被展平。
因此,您必须考虑希望元素沿着哪个轴是唯一的(对于NumPy,您的元组列表将看起来像一个2D数组);然后使用正确的axis关键字值。不幸的是,您很快就会发现这也行不通,因为元素被视为一个对象(因为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))}请注意,集合自然是无序的。
https://stackoverflow.com/questions/58662301
复制相似问题