numba 中的 int64 与 array(int64, 0d, C)
int64 vs array(int64, 0d, C) in numba
我定义了一个使用 numba 返回元组的 jited 函数。大概是下面的样子。
import numba as nb
from numba.types import Tuple
import numpy as np
FOO_T = Tuple.from_types((nb.types.NPDatetime('M'), nb.int64))
@nb.jit([FOO_T(nb.types.NPDatetime('M'), nb.types.NPDatetime('M'))], nopython=True)
def foo(input1, input2):
temp1 = input1
temp2 = np.array(input1 - input2).view(nb.int64)
output = (temp1, temp2)
return output
报如下TypeError。输出元组的第二个元素定义为 int64
。但是,它实际上被编译为 array(int64, 0d, C)
.
TypingError: No conversion from Tuple(datetime64[M], array(int64, 0d, C)) to Tuple(datetime64[M], int64) for 'return_value.15', defined at None
不知道如何使它们保持一致。感谢您的帮助。
np.array(input1 - input2).view(nb.int64)
是 int64
的数组而不是标量。这就是 Numba 报错的原因。请注意,np.array(input1 - input2)
会产生一个奇怪的类型:维度为 0 的数组。据我所知,这是 Numpy 用来表示标量的,但这样的数组不能在 Numba 中建立索引,也不能转换为标量。
您可以减去两个标量并用 np.array([input1 - input2])
构建一个数组,然后调用 view
。也就是说,view
可能不是您想在此处执行的操作,因为它将 NPDatetime
的二进制表示重新解释为整数。这真的很不安全,而且 AFAIK 没有理由认为这可以工作。你可以改变并用 (np.uint64)(input1 - input2)
.
转换结果
我定义了一个使用 numba 返回元组的 jited 函数。大概是下面的样子。
import numba as nb
from numba.types import Tuple
import numpy as np
FOO_T = Tuple.from_types((nb.types.NPDatetime('M'), nb.int64))
@nb.jit([FOO_T(nb.types.NPDatetime('M'), nb.types.NPDatetime('M'))], nopython=True)
def foo(input1, input2):
temp1 = input1
temp2 = np.array(input1 - input2).view(nb.int64)
output = (temp1, temp2)
return output
报如下TypeError。输出元组的第二个元素定义为 int64
。但是,它实际上被编译为 array(int64, 0d, C)
.
TypingError: No conversion from Tuple(datetime64[M], array(int64, 0d, C)) to Tuple(datetime64[M], int64) for 'return_value.15', defined at None
不知道如何使它们保持一致。感谢您的帮助。
np.array(input1 - input2).view(nb.int64)
是 int64
的数组而不是标量。这就是 Numba 报错的原因。请注意,np.array(input1 - input2)
会产生一个奇怪的类型:维度为 0 的数组。据我所知,这是 Numpy 用来表示标量的,但这样的数组不能在 Numba 中建立索引,也不能转换为标量。
您可以减去两个标量并用 np.array([input1 - input2])
构建一个数组,然后调用 view
。也就是说,view
可能不是您想在此处执行的操作,因为它将 NPDatetime
的二进制表示重新解释为整数。这真的很不安全,而且 AFAIK 没有理由认为这可以工作。你可以改变并用 (np.uint64)(input1 - input2)
.