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).

转换结果