#python #vectorization #jit #numba
Вопрос:
Я борюсь с ошибкой numba Untyped global name 'is_a_subset': Cannot determine Numba type of <class 'numba.np.ufunc.gufunc.GUFunc'>
, Это обычно означает, что я ошибся и использовал метод, который не поддерживается numba. Следующий код завершается ошибкой.
@guvectorize("(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
out[:]=np.array([item in x for item in y])
@njit()
def test(x,y,z):
is_a_subset(x,y,z)
return z.mean()
x=np.array([[1,2,3],[3,2,1]])
y=np.array([[3,6,1],[1,2,3]])
z = np.empty_like(x)
test(x,y,z)
Однако удаление njit в тестовой функции заставляет все работать.
def test(x,y,z):
is_a_subset(x,y,z)
return z.mean()
Почему numba пытается разрешить типы в режиме без python?
Я тоже пробовал, но без разных результатов
@guvectorize(["f8[:],f8[:],f8[:]"],"(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
out[:]=np.array([item in x for item in y])
Ответ №1:
Я использую Numba 0.53.1 и могу воспроизвести эту ошибку. В этом блоге об обновлении динамической отправки guvectorize
в Numba 0.53 упоминается об этом в конце (курсив добавлен).:
В будущем мы хотели бы приблизить эти
@guvectorize
возможности к@vectorize
тем, которые есть. Например, в настоящее время невозможно вызвать функцию guvectorize из функции jitted (@jit
).
Существует аналогичная открытая проблема с vectorize
, но она демонстрирует, что @vectorize
функции могут вызываться в @jit
функциях, просто это ограничено значением по умолчанию target = "cpu"
.
Комментарии:
1. есть идеи, как векторизировать эту функцию?
2. Пока разработчики Numba не разберутся с этим (а это может занять некоторое время), я бы просто разработал небольшие
@njit
@vectorize
функции или@guvectorize
функции, которые вызываются в 1 обычной функции Python , которая действует как клей, точно так же, как ваша незакрашеннаяtest
. Когда вы помещаете все циклы и векторизацию в NumPy или Numba, в функции клея почти ничего не остается для оптимизации.