我最近一直在试验Numba,这是我仍然无法理解的东西:
在具有NumPy数组的普通Python函数中,您可以执行以下操作:
# 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)
结果仍然不正确。考虑到this is supposed to be a supported Math operation,我不明白为什么它不起作用。
我知道标准方式是这样的:
# 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 This看起来很相关,但这里的功能只能在单个线程上运行......
答案 0 :(得分:2)
写这个的正确方法是:
@guvectorize(['void(float32[:], float32[:], float32[:])'],'(n),(n)->(n)')
def subT(a, b, res):
res[:] = a - b
你尝试过的原因不起作用的是python语法的限制,而不是numba特有的。
name = expr
将name的值重新绑定到expr,它永远不会改变name的原始值,就像你可以使用的那样,例如c ++参考。
name[] = expr
调用(实质上),name.__setitem__
可以用来修改名称,就像numpy数组那样,空切片[:]
指的是整个数组。