Присвойте одноэлементный массив элементу массива с помощью Numba - PullRequest
1 голос
/ 24 апреля 2019

Я пытаюсь назначить одноэлементный массив определенному элементу в массиве Numpy, используя режим nopython Numba, но я получаю TypeError, и я не могу понять, почему.Это прекрасно работает без Numba.Мой MCVE ниже.

import numpy as np
from numba import jit


@jit(nopython=True)
def mcve():
    tmp = np.zeros((2,2))
    tmp[0, 0] = np.array([0])


if __name__ == "__main__":
    mcve()

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:/Users/User/Dropbox/Work/Stockholms universitet/Uppsatser/Hyresregleringen/supplementary/pythontest/test.py", line 12, in <module>
    mcve()
  File "C:\Users\User\Anaconda3\lib\site-packages\numba\dispatcher.py", line 348, in _compile_for_args
    error_rewrite(e, 'typing')
  File "C:\Users\User\Anaconda3\lib\site-packages\numba\dispatcher.py", line 315, in error_rewrite
    reraise(type(e), e, None)
  File "C:\Users\User\Anaconda3\lib\site-packages\numba\six.py", line 658, in reraise
    raise value.with_traceback(tb)
numba.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Cannot resolve setitem: array(float64, 2d, C)[(0, 0)] = array(int64, 1d, C)

Я могу обойти ошибку, переписав вторую строку функции в tmp[0, 0] = np.array([0])[0].То есть путем извлечения первого элемента синглтона.Но должно ли это быть действительно необходимым?Или я просто что-то не так делаю?

1 Ответ

1 голос
/ 25 апреля 2019

Отлично работает без Numba

Да, но numba - это компромисс. Вы жертвуете некоторыми опциями и удобством ради скорости.

Я не могу понять, почему.

Поскольку (в настоящее время) нет преобразования (или перегрузки), которое поддерживает установку одного значения массива в массив 1d (даже если он содержит только один элемент).

Но разве это действительно необходимо?

Вероятно, нет. Но в целом это, вероятно, ошибка присвоить массив одному элементу , поэтому мне (лично) нравится, что он вызывает ошибку во время компиляции, а не во время выполнения.

Обратите внимание, что обобщенные случаи уже поддерживают разные размерные массивы:

Например:

@jit(nopython=True)
def mcve():
    tmp = np.zeros((2,2))
    tmp[0:1, 0:1] = np.array([2])

@jit(nopython=True)
def mcve():
    tmp = np.zeros((2,2))
    tmp[0:1, 0:1] = 2

@jit(nopython=True)
def mcve():
    tmp = np.zeros((2,2))
    tmp[0:1, 0:1] = np.array([[[[5]]]])

Но это случаи, которые могут быть оценены только во время выполнения и являются более обобщенными.

...