Как установить 2d массив на Jit Decorator без NumPy? - PullRequest
2 голосов
/ 28 июня 2019

Я использую библиотеку Numba в Python3.

Параметром функции является двумерный массив.

Я установил Jit-декораторы Numba на 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)

Есть идеи установить массив 2d на jit decorator без библиотеки numpy?

Или использовать библиотеку numpy?

1 Ответ

1 голос
/ 28 июня 2019

Numba с 0.44 не поддерживает список списков в качестве входных данных для функций в режиме nopython.См .:

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

В аргументах @jit numba не знает list и не может автоматически преобразовать его в любой тип numba.Ошибка TypeError ... subscriptable исходит от самого Python, поскольку вы пытаетесь получить доступ к элементу встроенного типа (в данном случае 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)
...