首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numba:索引一个向量会产生一个错误

Numba:索引一个向量会产生一个错误
EN

Stack Overflow用户
提问于 2022-03-26 13:04:27
回答 1查看 174关注 0票数 0

我最近开始使用python和numba。我的问题是:我有一个矩阵(n行和m列),.In是一个for循环,我必须更改特定列的值​​。

没有numba,代码运行良好。但是当我使用njit()时,它就会崩溃。

注意:在我的实际项目中,每一行都没有相同的值。

这是我需要的一个例子。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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个候选实现:

  • 14不匹配的原因是:函数“setitem”的重载:文件::行N/A,参数为:‘(数组(int32,2d,C),元组(int64,反射列表(Int64)),反射列表(Int64)):不匹配。
  • 中的2条由于以下原因而不匹配:函数’SetItemBuffer.Generic‘中的重载:文件:numba/core/Tuple/arraydec.py:第176行。带参数:‘(数组(int32,2d,C),元组(int64,反射列表(Int64),反射列表(Int64))“:拒绝,因为实现引发了一个特定的错误: NumbaTypeError:不支持的数组索引类型反射列表(Int64)在元组中(int64,反射列表(Int64))

期间:在/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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-26 13:24:22

Numba不支持良好的反射列表(可能具有不同类型的对象的CPython列表)。您需要使用类型的listsNumpy数组。原因是Numba需要处理定义良好的类型化变量,而不是动态类型的对象,这样才能提高效率(并且实际上能够用本机二进制文件编译代码)。在您的示例中,最好使用Numpy数组。

此外,Numba似乎无法编译像matrix[i, columns_idx] = replace_values这样的行。Numba还不支持所有的Numpy特性。因此,您需要使用一个基本循环代替。

下面是一个经过更正的代码示例:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71628294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档