numba.vectorize ufunc 不支持 timedelta64

numba.vectorize ufunc does not support timedelta64

带有 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 'myless' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

怎么了?我该如何解决?

我在 Numba 0.17 发行说明中找到了提示(现在已经是很旧的版本):

Issue #917: Allow vectorizing with datetime64 and timedelta64 in the signature (only with unit-less values, though, because of a Numpy limitation).

导致这个 comment:

it seems numpy won't less us call ufuncs with non-unitless datetimes and timedeltas, so we're cooked [...]

所以显然你不能在 nopython 模式下将 Numba 矢量化 ufunc 与 NumPy timedelta64 一起使用,除非 timedelta64 没有指定单位(在我的示例中,数组类型具有 [ns] 纳秒,甚至将单位添加到标量没有帮助)。

这只是一种解决方法,但您始终可以将时间增量零复制查看为整数(反之亦然)

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)