在Numba的@guvectorize中使用NumPy数组操作

时间:2018-05-24 09:04:21

标签: python numpy numba

我最近一直在试验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看起来很相关,但这里的功能只能在单个线程上运行......

1 个答案:

答案 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数组那样,空切片[:]指的是整个数组。