Я использую библиотеку Numba в Python3.
Параметр функции представляет собой двумерный массив.
Я установил для декораторов 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)
У вас есть идея установить 2d-массив в декораторе jit без библиотеки numpy?
Или нужно использовать библиотеку numpy?






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)
Спасибо за ваше объяснение и правильный пример, это дало мне понять, что я неправильно понял о numba, и дал мне больше ясности в этом.
Как я упоминал в недавнем ответе (stackoverflow.com/a/56794390/392949), numba не поддерживает список списков. То, что вы передаете, не является массивом 2d в том смысле, что Numba считает массив 2d. Если бы вы передали
np.array(matrix)и удалили спецификацию типа в декораторе, numba смогла бы интерпретировать ее и выполнить JIT-код.