Проблема в том, что для numba-версии np.min
требуется array
в качестве ввода.
from numba import njit
import numpy as np
@njit
def test_numba_version_of_numpy_min(inp):
return np.min(inp)
>>> test_numba_version_of_numpy_min(np.array([1, 2])) # works
1
>>> test_numba_version_of_numpy_min([1, 2]) # doesn't work
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Invalid use of Function(<function amin at 0x000001B5DBDEE598>) with argument(s) of type(s): (reflected list(int64))
* parameterized
In definition 0:
All templates rejected with literals.
In definition 1:
All templates rejected without literals.
This error is usually caused by passing an argument of a type that is unsupported by the named function.
Лучшим решением было бы просто использовать numba-версию Pythons min
:
from numba import njit
import numpy as np
@njit
def availarray(length):
out = np.ones(14)
if length > 0:
out[0:min(length, 14)] = 0
return out
Поскольку np.min
и min
на самом деле являются версиями этих функций Numba (по крайней мере, в njit
ted функциях), min
также должна быть намного быстрее в этом случае.Однако это вряд ли будет заметно, потому что выделение массива и установка некоторых элементов в ноль будут основными вкладчиками времени выполнения здесь.
Обратите внимание, что вам даже не нужен вызов min
здесь - потому чтонарезка неявно останавливается в конце массива, даже если используется больший индекс остановки:
from numba import njit
import numpy as np
@njit
def availarray(length):
out = np.ones(14)
if length > 0:
out[0:length] = 0
return out