numba.vectorize ufunc不支持timedelta64

时间:2017-08-23 05:46:46

标签: numpy vectorization numba timedelta

带有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;

出了什么问题?我该如何解决?

2 个答案:

答案 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)