передать список списка в функцию numba в режиме без Python, если элемент в list_of_list [0] не работает - PullRequest
0 голосов
/ 07 декабря 2018

См. Следующий минимальный код,

import numba
list_of_list = [[1, 2], [34, 100]]
@numba.njit()
def test(list_of_list):
    if 1 in list_of_list[0]:
        return 'haha'

test(list_of_list)

Это не будет работать, и кажется, что list_of_list [0] больше не ведет себя как список во время компиляции.Однако работает следующий код:

list_of_list = [[1, 2], [34, 100]][0] # this is a list NOW!
@numba.njit()
def test(list_of_list):
    if 1 in list_of_list:
        return 'haha'

test(list_of_list)

На этот раз я перехожу к списку, а не к списку.Тогда это работает.Кажется, for i in list работает в Numba, а не for i in list_of_list.

В моем случае использование передачи списка или массива, такого как двумерные данные, в функцию numba является обычным делом.Иногда мне нужен только один элемент в списке, который динамически определяется в программе.

Чтобы заставить его работать, я на самом деле разработал решение: сделав list_of_list сведенным в long list, затем используйте линейный индекс для извлечения одного элемента из оригинала list_of_list.

Я спрашиваю здесь, есть ли другие альтернативные решения?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вы можете вернуть строку с моей исправленной версией.Он прошел тестирование и успешно работал.

from numba import njit
import numpy as np


@njit
def test():
    if 1 in set(np_list_of_list[0]):
        return 'haha'


if __name__ == '__main__':
    list_of_list = [[1, 2], [34, 100]]
    np_list_of_list = np.array(list_of_list)
    print(test()) 
0 голосов
/ 07 декабря 2018

Метод in работает на множествах.Возврат строки также может вызвать некоторые проблемы.

Рабочий пример

import numba as nb
import numpy as np

array_2D = np.array([[1, 2], [34, 100]])

@nb.njit()
def test(array_2D):
    if 1 in set(array_2D[0]):
        #Strings also causes sometimes problems
        #return 'haha'
        return(1)
    else:
        return(-1)
...