我最近开始使用python和numba。我的问题是:我有一个矩阵(n行和m列),.In是一个for循环,我必须更改特定列的值。
没有numba,代码运行良好。但是当我使用njit()时,它就会崩溃。
注意:在我的实际项目中,每一行都没有相同的值。
这是我需要的一个例子。
import numpy as np
def func_test(matrix_size, columns_idx, replace_values):
matrix = np.zeros((matrix_size, matrix_size), dtype='int32')
for i in range(0, matrix_size):
matrix[i, columns_idx] = replace_values
return matrix
columns_idx = [0,2,4]
replace_values = [1, 3, 5]
new_matrix = func_test(5, columns_idx, replace_values)
print(new_matrix)
[[1 0 3 0 5]
[1 0 3 0 5]
[1 0 3 0 5]
[1 0 3 0 5]
[1 0 3 0 5]]现在我要申请Numba。
import numpy as np
from numba import njit
@njit()
def func_test(matrix_size, columns_idx, replace_values):
matrix = np.zeros((matrix_size, matrix_size), dtype='int32')
for i in range(0, matrix_size):
matrix[i, columns_idx] = replace_values
return matrix
columns_idx = [0,2,4]
replace_values = [1, 3, 5]
new_matrix = func_test(5, columns_idx, replace_values)
print(new_matrix)这个错误出现在:
未实现可供签名的函数函数():
>>> setitem(数组(int32,2d,C),元组(int64,反射列表(Int64)),反射列表(Int64))
有16个候选实现:
期间:在/Users/goncaloguedes/Desktop/Fold_Unfold/Python_Fold_UnFold/Testes.py上键入setitem (10)
文件"Testes.py",第10行: def func_test(matrix_size,columns_idx,replace_values):i在范围内(0,matrix_size):矩阵,columns_idx = replace_values
发布于 2022-03-26 13:24:22
Numba不支持良好的反射列表(可能具有不同类型的对象的CPython列表)。您需要使用类型的lists或Numpy数组。原因是Numba需要处理定义良好的类型化变量,而不是动态类型的对象,这样才能提高效率(并且实际上能够用本机二进制文件编译代码)。在您的示例中,最好使用Numpy数组。
此外,Numba似乎无法编译像matrix[i, columns_idx] = replace_values这样的行。Numba还不支持所有的Numpy特性。因此,您需要使用一个基本循环代替。
下面是一个经过更正的代码示例:
import numpy as np
from numba import njit
@njit()
def func_test(matrix_size, columns_idx, replace_values):
matrix = np.zeros((matrix_size, matrix_size), dtype=np.int32)
for i in range(0, matrix_size):
for j in range(0, columns_idx.size):
matrix[i, columns_idx[j]] = replace_values[j]
return matrix
columns_idx = np.array([0, 2, 4], np.int64)
replace_values = np.array([1, 3, 5], np.int32)
new_matrix = func_test(5, columns_idx, replace_values)
print(new_matrix)https://stackoverflow.com/questions/71628294
复制相似问题