Работа с массивами numpy и управление ими с помощью numba

Почему jit Numba не может скомпилировать простую операцию массива Numpy?

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

import numpy as np
from numba import jit

rows = 10
columns = 999999
A = np.empty((rows, columns))
b = np.linspace(0, 1, num=rows)

@jit(nopython=True)
def replicate(A, b):
    for i in range(A.shape[1]):
        A[:, i] = b
    return A #optional

replicate(a, b)

Со следующей ошибкой:

TypingError: Failed at nopython (nopython frontend)
Cannot resolve setitem: array(float64, 1d, C, nonconst)[(slice3_type, int64)] = array(float64, 1d, C, nonconst)
File "<ipython-input-32-db24fbe2922f>", line 12

Я делаю что-то неправильно?

Кроме того, мне нужен режим nopython, потому что в моей реальной ситуации мне нужно часто выполнять сложение массива, умножение на скаляры и заполнение массива другими массивами. и я понимаю, что в объектном режиме я не смогу выполнять джиттинг цикла и, следовательно, я не увижу реального повышения производительности при выполнении.


person gota    schedule 05.05.2015    source источник


Ответы (1)


Numba не поддерживает нарезку numpy в режиме nopython. Попробуйте развернуть циклы явно:

rows = 10
columns = 999999
a = np.empty((rows, columns))
b = np.linspace(0, 1, num=rows)

@jit(nopython=True)
def replicate(A, b):
    for i in xrange(A.shape[0]):
        for j in xrange(A.shape[1]):
            A[i, j] = b[i]
    return A #optional

replicate(a, b)
person JoshAdel    schedule 05.05.2015