我正在尝试创建一个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, 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 [:])来解决问题:
for i in range(unique_years.size):
for j in range(window_sizes.size):
res[i, j] = 0
但这似乎是单声道的,可能比简单的演员要慢。使用res [:,:]会引发一个转换错误。