我想在Numba函数中创建一个日期数组,以nopython模式运行。
我看不到日期类型,所以我正在尝试NPDatetime。
我试过的代码是:
import numba as nb
import numpy as np
@nb.jit(nopython=True)
def xxx():
return np.empty(10, dtype=nb.types.NPDatetime('D'))
print(xxx())
但是,代码返回此错误:
Unknown attribute 'NPDatetime' of type Module(<module 'numba.types' from '/home/xxx/anaconda3/lib/python3.6/site-packages/numba/types/__init__.py'>)
我的numba版本是0.39.0
编辑:我必须纠正自己,numba支持numpy.empty()
和datetime64
:
Numba支持以下Numpy标量类型:[...]日期时间和时间戳:任何单位[...] 资料来源:Section 2.7.1
numpy.empty()
(只有2个第一个参数) 资料来源:Section 2.7.3.3
不知道是什么原因造成你的问题
您已错误地指定了dtype
参数。 Numpy没有使用numba类。以下是正确指定dtype
的方法:(阅读更多here和here)
dtype="datetime64[D]"
但即使你以这种方式指定了论证,它也行不通。 nopython
对@nb.jit()
的论证本身并不支持这种类型。这是更正后的代码:(阅读更多here)
import numba as nb
import numpy as np
@nb.jit
def xxx():
return np.empty(10, dtype="datetime64[D]")
print(xxx())
但考虑给numba一个类型提示:
import numba as nb
import numpy as np
@nb.jit(nb.types.NPDatetime('D')()) # returns datatime, no arguments
def xxx():
return np.empty(10, dtype="datetime64[D]")
print(xxx())
我之前从未使用过numba或numpy,因此需要进行一些研究,但这应该有效。
import numba as nb
import numpy as np
from numba import *
def xxx():
return np.empty(10, dtype=np.dtype(np.datetime64('2014')))
jitcompute = nb.jit(nopython=True)(xxx)
print(xxx())
让我知道这个是否奏效!
正如评论中所述,我的代码是在没有及时装饰器的情况下执行的,未来的研究似乎有一个错误,其中dtype不能在JIT装饰函数中使用https://github.com/numba/numba/issues/3066
我现在花了4-5个小时解决这个问题,我找不到解决方法,你可以解析通过xxx函数创建的数组,但你不能在装饰函数中使用empty()或zeros()