Массивы как параметры функции в numba - PullRequest
0 голосов
/ 25 февраля 2019

Следующий простой пример завершается с ошибкой:

Автономный модуль:

from numba.pycc import CC

cc = CC('foo')

@cc.export('product','float64(float64[:], float64[:])')
def product(a, b):
    prod = 0
    for i in range(a.size):
        prod += a[i] * b[i]
    return prod

if __name__ == "__main__":
    cc.compile()

Тестовая программа:

import numpy as np
import foo

x = np.array([2,3,1,0])
y = np.array([2,3,1,0])

print(foo.product(x,y))

Сбой с сообщением об ошибке:

Traceback (most recent call last):
  File "\temp\test.py", line 7, in <module>
    print(foo.product(x,y))
SystemError: exception RuntimeError<class 'BytesWarning'> not a BaseException subclass

Используемая версия numba - 0.42.0 и Python 3.7.2 для Windows.Есть намеки?

1 Ответ

0 голосов
/ 02 марта 2019

Итак, я наконец-то получил ваш код на работу:

from numba.pycc import CC

cc = CC('foo')
cc.verbose = True
@cc.export('producti','int64(int64[:], int64[:])')  #<--- Your data type was wrong
def product(a, b):
    prod = 0
    for i in range(a.size):
        y = a[i] * b[i]
        prod += y
    return prod

if __name__ == "__main__":
    cc.compile()

Код для проверки вышеуказанной функции:

import numpy as np
import foo

x = np.array([2, 3, 1, 0])
y = np.array([2, 3, 1, 0])

print(foo.producti(x, y))   # Output : 14

Некоторые замечания, которые следует отметить здесь :

  • То, как вы создаете массивы x и y, по умолчанию dtype установлен на int64, поэтому, когда вы вписываете его в float64, он неправильно конвертируется.

print (x.dtype)

Вывод: dtype ('int64')

  • Итак,просто установив ваши типы на int64, добьемся цели (или вы можете использовать i8 для краткости, если хотите).

  • Ссылка на блокнот Google Colab с запущенным кодом: Ссылка на ноутбук

Ссылки :

...