首页 > 解决方案 > 如何在没有 numpy 的情况下在 jit 装饰器上设置二维数组?

问题描述

我在 Python3 中使用 Numba 库。

函数的参数是一个二维数组。

我将 Numba jit 装饰器设置为list[list[int]],但TypeError: 'type' object is not subscriptable在运行代码后显示。

print(numba.typeof(matrix))用来检测参数类型,它返回list(reflected list(int32))类型。

但即使我将装饰器更改为list[list[numba.int32]],也无法正常工作。

代码:

from numba import jit

size = 3
matrix = [[0, 1, 2], [4, 5, 6], [7, 8, 9]]


@jit(list[list[int]])
def test(jitmatrix):
    _total = 0
    for i in range(size):
        for j in range(size):
            _total += jitmatrix[j][i]


test(matrix)

知道在没有 numpy 库的情况下在 jit 装饰器上设置二维数组吗?

还是必须使用 numpy 库?

标签: pythonarrayspython-3.xnumpynumba

解决方案


从 0.44 开始的 Numba 不支持将列表列表作为 nopython 模式下函数的输入。看:

http://numba.pydata.org/numba-doc/latest/reference/pysupported.html#list-reflection

在 to 的参数中@jit,numba 不知道list也无法将其自动转换为任何 numba 类型。错误来自TypeError ... subscriptablepython 本身,因为您试图访问内置类型的元素(list在这种情况下),这是不允许的。

以下将起作用:

from numba import jit
import numba as nb
import numpy as np

size = 3
matrix = np.array([[0, 1, 2], [4, 5, 6], [7, 8, 9]])


@jit(nopython=True)
# or @jit(nb.int64(nb.int64[:,:]))
def test(jitmatrix):
    _total = 0
    for i in range(size):
        for j in range(size):
            _total += jitmatrix[j,i]  # note the change in indexing, which is faster

    return _total


test(matrix)

推荐阅读