Как установить 2d-массив в декоратор jit без numpy?

Я использую библиотеку 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?

Как я упоминал в недавнем ответе (stackoverflow.com/a/56794390/392949), numba не поддерживает список списков. То, что вы передаете, не является массивом 2d в том смысле, что Numba считает массив 2d. Если бы вы передали np.array(matrix) и удалили спецификацию типа в декораторе, numba смогла бы интерпретировать ее и выполнить JIT-код.

JoshAdel 28.06.2019 13:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
900
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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, и дал мне больше ясности в этом.

Vic 28.06.2019 19:02

Другие вопросы по теме