我最近一直在努力与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''
之前我曾经遇到过这个错误,但我不知道这意味着什么或如何修复它。我如何获得所需的结果?提前谢谢。
答案 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)