带有NumPy ufunc的示例代码:
import numpy as np
nums = np.array([1, 2, 3])
times = nums.astype('timedelta64[ns]')
np.less(nums, 2)
np.less(nums, np.timedelta64(2))
这两个都给出了相同的结果:
array([ True, False, False], dtype=bool)
现在我想和Numba做类似的事情:
import numba
@numba.vectorize(nopython=True)
def myless(a, b):
return a < b
myless(nums, 2)
myless(times, np.timedelta64(2)) # fails
第一个给出正确的结果,但第二个失败:
TypeError:ufunc&#39; myless&#39;不支持输入类型,并且根据投射规则无法安全地将输入强制转换为任何支持的类型&#39;&#39;&#39;
出了什么问题?我该如何解决?
答案 0 :(得分:0)
我在Numba 0.17发行说明中找到了一个提示(现在已经很老了):
问题#917:允许在签名中使用datetime64和timedelta64进行矢量化(但由于Numpy限制,仅使用无单位值)。
导致此comment:
似乎numpy不会减少我们用非单位日期时间和timedeltas调用ufuncs,所以我们已经煮熟了[...]
所以显然你不能在nopython模式下使用带有NumPy timedelta64的Numba矢量化ufunc,除非timedelta64没有指定单位(在我的例子中,数组类型有[ns]
纳秒,甚至将单位添加到标量没有帮助。)
答案 1 :(得分:0)
这只是一种解决方法,但您始终可以将整个时间点视为整数(反之亦然)
In [80]: i8 = np.dtype('int64')
In [81]: myless(times.view(i8), np.timedelta64(2).view(i8))
Out[81]: array([ True, False, False], dtype=bool)