Python 将numba GUEVECTORIZE输出数组初始化为零
我正在尝试创建一个guvectorize函数,该函数迭代数据并在输出矩阵中更改单元格的值。问题是,当nopython=True时,我无法使输出矩阵初始化为零,输出结果包含无意义的数字Python 将numba GUEVECTORIZE输出数组初始化为零,python,numpy,numba,Python,Numpy,Numba,我正在尝试创建一个guvectorize函数,该函数迭代数据并在输出矩阵中更改单元格的值。问题是,当nopython=True时,我无法使输出矩阵初始化为零,输出结果包含无意义的数字 import numpy as np from numba import guvectorize @guvectorize(['void(float64[:], float64[:], int8[:])'], '(n),(n)->(n,n)', nopython=True) def test(array_1
import numpy as np
from numba import guvectorize
@guvectorize(['void(float64[:], float64[:], int8[:])'], '(n),(n)->(n,n)', nopython=True)
def test(array_1, array_2, res):
res[:] = 0
for i in range(array_1.size):
if array_1[i] > 1:
res[i] += 1
a = np.float64(np.random.randint(0, 2, (6)))
b = np.float64(np.random.randint(0, 2, (6)))
c = test(a, b)
print(c)
输出:
[[ 0 3 -126 4 0 0]
[ 0 0 0 53 26 2]
[ 0 0 0 0 0 53]
[ 0 2 0 0 0 0]
[ 0 59 33 2 0 0]
[ 0 0 56 91 58 93]]
当nopython=False时,这会给出正确的输出,但随后我会损失大量的处理速度
我可以通过在代码开头迭代初始化为零(代替res[:])来解决这个问题:
但这似乎不太和谐,可能比简单的演员阵容更慢。使用res[:,:]会引发强制转换错误。我被您的示例代码弄糊涂了,因为未使用
array_2
,并且在测试函数中,您只传递了3个参数中的2个。此外,guvectorize函数不返回结果,它们只填充res
。你能发布一个工作示例吗?这是你实际使用的代码吗?我不太明白它如何创建示例输出。而且,它不会在我的系统上编译。在修复int8[:,:]
后,它不会抱怨res[:]=0
,并且似乎工作正常。也就是说,您可能不需要担心numba中的循环。它们被认为是“非python”的,因为在普通python中循环可能很慢。但是,numba编译的循环几乎可以和numpy内置循环一样快。您担心的是nopython=True
解决方案是unpythonic
?您还可以使用0和1的值初始化输入数组,然后检查是否有任何值大于1,这是永远不会发生的,因此循环不会计算任何内容。我还想明确分配切片,因为2d数组的res[I]+=
不是很清楚,为什么不使用res[I,:]+=
来代替呢?我被你的示例代码弄糊涂了,因为array_2
没有使用,而且在测试函数中你只传递了3个参数中的2个。此外,guvectorize函数不返回结果,它们只填充res
。你能发布一个工作示例吗?这是你实际使用的代码吗?我不太明白它如何创建示例输出。而且,它不会在我的系统上编译。在修复int8[:,:]
后,它不会抱怨res[:]=0
,并且似乎工作正常。也就是说,您可能不需要担心numba中的循环。它们被认为是“非python”的,因为在普通python中循环可能很慢。但是,numba编译的循环几乎可以和numpy内置循环一样快。您担心的是nopython=True
解决方案是unpythonic
?您还可以使用0和1的值初始化输入数组,然后检查是否有任何值大于1,这是永远不会发生的,因此循环不会计算任何内容。我还将明确分配切片,因为二维数组的res[I]+=
不是很清楚,为什么不使用res[I,:]+=
?
for i in range(unique_years.size):
for j in range(window_sizes.size):
res[i, j] = 0