最近我一直在尝试使用Numba,但有些事情我仍然无法理解:
在普通的Python函数中使用NumPy数组时,你可以像这样做:
# Subtracts two NumPy arrays and returns an array as the result
def sub(a, b):
res = a - b
return res
然而,当你使用Numba的@guvectorize
装饰器时,代码如下:
# Subtracts two NumPy arrays and returns an array as the result
@guvectorize(['void(float32[:], float32[:], float32[:])'],'(n),(n)->(n)')
def subT(a, b, res):
res = a - b
结果甚至不正确。更糟糕的是,有时会抱怨“在[参数]中无效使用[数学运算符]”。
我很困惑。即使我尝试这样做:
# Subtracts two NumPy arrays and returns an array as the result
@guvectorize(['void(float32[:], float32[:], float32[:])'],'(n),(n)->(n)')
def subTt(a, b, res):
res = np.subtract(a,b)
结果仍然不正确。考虑到 这应该是一个支持的数学运算符,我不明白为什么它不起作用。
我知道标准的方法是这样的:
# Subtracts two NumPy arrays and returns an array as the result
@guvectorize(['void(float32[:], float32[:], float32[:])'],'(n),(n)->(n)')
def subTtt(a, b, res):
for i in range(a.shape[0]):
res[i] = a[i] - b[i]
这确实按照预期工作。
但是我的方法有什么问题吗?
P / S 这只是一个微不足道的例子,用于解释我的问题,我实际上并不打算仅使用@guvectorize
减去数组:P
P / P / S 我怀疑与将数组复制到GPU内存的方式有关,但我不确定......
P / P / P / S 这个看起来相关,但这里的函数仅在单个线程上运行...
res
,而在 gufunc 中,你需要改变输入。 - chrisb