Numba v0.44: не может отразить элемент отраженного контейнера - PullRequest
1 голос
/ 27 июня 2019

Я новичок в numba и на каждом шагу изо всех сил пытаюсь получить то, что я считаю простым для работы в режиме nopython.

Например, вдохновленный этим вопросом coalescing-range Я написал следующую функцию:

@njit
# @jit
def coalesce(ranges):
    coalesced = []
    for i, (label_a, start_a, stop_a) in enumerate(ranges):
        append_flag = True
        for j, (label_b, start_b, stop_b) in enumerate(coalesced):
            if label_a != label_b: # not of same type
                continue
            elif stop_a < start_b: # a does not start and then overlap b
                continue
            elif stop_b < start_a: # b does not start and then overlap a
                continue
            else:
                # same type and overlap, merge into i, do not append
                append_flag = False
                coalesced[j] = [label_a, min([start_a, start_b]), max([stop_a, stop_b])]
                break
        if append_flag:
            coalesced.append([label_a, start_a, stop_a])
    return coalesced

Предполагается, что он передается в списке списков.Каждый подсписок состоит только из целых чисел [type, start, stop], и упоминается, что эта функция объединяет одинаковые типизированные диапазоны, которые перекрываются, например,

[
    [1, 10, 100],
    [0, 50, 75],
    [1, 50, 150],
    [0, 10, 100],    
    [0, 200, 300],    
    [0, 15, 150]
]
# becomes
[
    [0, 10, 150],
    [0, 200, 300],
    [1, 10, 150]
]

Эта функция работает с @jit (хотя она выдает массу предупреждений).При вызове этой функции с помощью @njit и вышеприведенного списка:

TypeError: Failed in nopython mode pipeline (step: nopython mode backend)
cannot reflect element of reflected container: reflected list(reflected list(int64))

Я понятия не имею, что это значит или почему это не получается.

1 Ответ

0 голосов
/ 27 июня 2019

Numba с 0.44 не поддерживает список списков в качестве входных данных для функций в режиме nopython. См:

http://numba.pydata.org/numba-doc/latest/reference/pysupported.html#list-reflection

Предупреждения, которые вы видите при использовании jit, связаны с тем, что при переходе к объектному режиму, но в будущих выпусках numba, это вызовет ошибку, а не отступит. См:

http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit

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

...