Numba:根据投射规则,不能将输入强制转换为任何支持的类型'安全''

时间:2018-02-22 02:56:47

标签: python numba

我最近一直在努力与numba斗争。 直接从numba docs复制此代码段,它可以正常工作:

@guvectorize([(int64[:], int64, int64[:])], '(n),()->(n)')
def g(x, y, res):
    for i in range(x.shape[0]):
        res[i] = x[i] + y

a = np.arange(5)
g(a,2)

给y一个数组会产生一个网格。总结2个数组是我做了很多事情,所以这就是我通过修改代码段来提出的代码。

@guvectorize([(int64[:], int64[:], int64[:])], '(n),(n)->(n)')
def add_arr(x, y, res):
    for i in range(x.shape[0]):
        res[i] = x[i] + y[i]

p = np.ones(1000000)
q = np.ones(1000000)
r = np.zeros(1000000)

add_arr(p,q)

这给了我错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-75-074c0fd345aa> in <module>()
----> 1 add_arr(p,q)

TypeError: ufunc 'add_arr' not supported for the input types, and the      inputs could not be safely coerced to any supported types according to the casting rule ''safe''

之前我曾经遇到过这个错误,但我不知道这意味着什么或如何修复它。我如何获得所需的结果?提前谢谢。

1 个答案:

答案 0 :(得分:2)

您正在使用numpy.ones生成一个列表,并根据文档(https://docs.scipy.org/doc/numpy/reference/generated/numpy.ones.html):

  

dtype:data-type,optional

     

数组的所需数据类型,例如numpy.int8。默认为numpy.float64。

np.ones(1000000)numpy.float64个列表。但是,您的add_arr规范需要int64列表,因此TypeError会爆炸。

一个简单的解决方法:

p = np.ones(1000000, dtype=np.int64)
q = np.ones(1000000, dtype=np.int64)