Почему Numba не может скомпилировать эту функцию? - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь скомпилировать следующую функцию с помощью Numba:

@njit(fastmath=True, nogil=True)
def generate_items(array, start):
    array_positions = np.empty(SIZE, dtype=np.int64)
    count = 0
    while count < SIZE - start:
        new_array = mutate(np.empty(0, dtype=np.uint8))

        if len(new_array) > 0:
            array_positions[count] = len(array)  # <<=== FAILS HERE
            array = np.append(array, np.append(new_array, 255))
            count += 1

    return array, array_positions

Но это не удается в указанной строке выше с этим сообщением об ошибке:

numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Cannot unify array(uint8, 1d, C) and array(int64, 1d, C) for 'array.3', defined at ...

Что не похоже чтобы иметь смысл, поскольку я просто назначаю int (результат на len) массиву, который имеет dtype из np.int64?

Обратите внимание, что array имеет тип np.uint8 - но я не назначаю сам массив, поэтому это сообщение не имеет для меня смысла.

Я попытался выполнить рефакторинг до этого:

tmp = len(array)  # <<=== FAILS HERE
array_positions[count] = tmp  

Но тут ничего не вышло .. . то же сообщение.

Я также попытался заменить len(array) на array.size, так как это 1d массив, но та же ошибка.

Кто-нибудь может понять, почему это не удается?

Я на Python 3,7 и нумба 0,50

Спасибо!

1 Ответ

0 голосов
/ 22 июля 2020

Первая проблема заключается в том, что вы используете неподдерживаемую функцию mutate ( как указано здесь ). Затем, как говорится в ошибке, вы пытаетесь добавить массивы с разными типами данных в

np.append(array, np.append(new_array, 255))

, где array имеет тип int64, а new_array содержит значения типа uint8. Если бы вы использовали @jit, это показало бы вам предупреждение о переходе в режим object, но поскольку вы принудительно включили режим nonpython с помощью декоратора @njit, он выдает ошибку. Ура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...