Numba с неработающей матрицей - неизвестный атрибут - PullRequest
0 голосов
/ 25 апреля 2018

Я делаю следующий расчет:

y = np.mat(np.log(datay))   
x = np.mat([datax**2, datax, np.ones(len(datax))]).T
popt = (x.T * x).I * x.T * y.T

datax и datay - это нормальные 1-мерные массивы, например:

datay = np.array([1,4,9,16])
datax = np.array([1,2,3,4])

Расчет работает хорошо. Но я хотел ускорить это, поэтому я попытался поместить это в numba: (Я действительно плохо знаком с numba ... но хочу попробовать)

@jit(nopython=True)
def calc(datax, datay):
    y = np.mat(np.log(datay))   
    x = np.mat([datax**2, datax, np.ones(len(datax))]).T
    return (x.T * x).I * x.T * y.T

но это не работает. Я получаю следующую ошибку

Сбой на nopython (внешний интерфейс nopython)

Неизвестный атрибут 'matrix' типа Module numpy

Так, как я могу заставить это работать?


Второе: как вы могли заметить, я вычисляю параметры полинома второго порядка. Мне нужно сделать это как можно быстрее, потому что мне нужно делать это часто. Так что сейчас я просто перебираю все

result = np.zeros(len(datay), 3)
datax  = np.array([1,2,3,4)]  
x = np.matrix([datax**2, datax, np.ones(len(datax))]).T  
for i, data in enumerate(datay):
    data = np.array(data-baseline)
    if (any(i <= 0 for i in data)): continue
    try:
        y = np.matrix(np.log(data))                 
        result[i] = ((x.T * x).I * x.T * y.T).A1

Как мне это ускорить: просто поместите все в одну функцию numba и надейтесь, что компиляция подойдет? Или есть другие разумные способы? У Numba есть инструменты для распараллеливания, верно? Могут ли они применяться в моем случае?

Спасибо за ваше время :) 1026 *

1 Ответ

0 голосов
/ 25 апреля 2018

Все функции numpy, которые поддерживает numba, перечислены на следующей странице документа:

http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html

Поддержка объектов-матриц не указана, поэтому в настоящее время их нельзя использовать в программах с numba jited. Если то, что вы делаете, легко векторизовано и не требует создания множества объектов промежуточного массива, то ускорение, которое вы получаете от numba, вероятно, будет ограничено. Вы можете попробовать переключиться с matrix на array структуры данных, так как последняя поддерживается. Матричный объект просто немного отличается по поведению, поэтому преобразование кода должно быть простым.

...