我最近開始使用 python 和 numba。我的問題是:我有一個矩陣(n 行和 m 列)。在 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)
并出現此錯誤:
未找到用于簽名的函式 Function(<built-in function setitem>) 的實作:
\>>> setitem(array(int32, 2d, C), Tuple(int64, 反射串列(int64)<iv=None>), 反射串列(int64)<iv=None>)
有 16 個候選實作:
- Of which 14 did not match due to: Overload of function 'setitem': File: <numerous>: Line N/A. With argument(s): '(array(int32, 2d, C), Tuple(int64, reflected list(int64)<iv=None>), reflected list(int64)<iv=None>)': No match.
- Of which 2 did not match due to: Overload in function 'SetItemBuffer.generic': File: numba/core/typing/arraydecl.py: Line 176. With argument(s): '(array(int32, 2d, C), Tuple(int64, reflected list(int64)<iv=None>), reflected list(int64)<iv=None>)': Rejected as the implementation raised a specific error: NumbaTypeError: unsupported array index type reflected list(int64)<iv=None> in Tuple(int64, reflected list(int64)<iv=None>) raised from /Users/goncaloguedes/.conda/envs/Python_Fold_UnFold/lib/python3.9/site-packages/numba/core/typing/arraydecl.py:72
期間:在 /Users/goncaloguedes/Desktop/Fold_Unfold/Python_Fold_UnFold/Testes.py 輸入 setitem (10)
檔案“Testes.py”,第 10 行:def func_test(matrix_size, columns_idx, replace_values): <source elided> for i in range(0, matrix_size): matrix[i, columns_idx] = replace_values
uj5u.com熱心網友回復:
Numba 不支持良好反映的串列(具有可能不同型別的物件的 CPython 串列)。您需要使用型別串列或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://www.uj5u.com/houduan/449873.html
標籤:Python python-3.x 麻木的 索引 麻木
上一篇:具有獨特熊貓的資料框
