Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将numba GUEVECTORIZE输出数组初始化为零_Python_Numpy_Numba - Fatal编程技术网

Python 将numba GUEVECTORIZE输出数组初始化为零

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

我正在尝试创建一个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[:])来解决这个问题:


但这似乎不太和谐,可能比简单的演员阵容更慢。使用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