Возможна ли функция numba на numpy с именованными столбцами? - PullRequest
0 голосов
/ 04 мая 2020

Numba - отличный инструмент для ускорения анализа массива numpy. Но я застрял с использованием доступа на основе индекса, который становится все труднее поддерживать, чем сложнее становится код. Я собираюсь ввести какой-то вид поиска, чтобы я мог указать хотя бы столбец «имя» для массива numpy. Любые предложения приветствуются. Для иллюстрации: моя лучшая идея до сих пор - простой дикт: the array:

@jit(nopython=True)
def numbaprocess(array,index):
    if array[index,2]>0.3:
        return 1
    else:
        return 0
    ### more processes with different columns, index, index-1 etc.

Вышеописанное работает просто отлично, но, как уже упоминалось, я должен отслеживать все столбцы по индексу, что подвержено ошибкам, и если я изменяю форму массива, мне нужно обновить код: Поэтому я попробовал это, но numba не принимает python dicts.

@jit(nopython=True)
def numbaprocess_readable(array,index,coldict):
    if array[index,coldict['C']]>0.3:
        return 1
    else:
        return 0

TypingError: Failed in nopython mode pipeline (step: nopython frontend)
non-precise type pyobject
[1] During: typing of argument at <ipython-input-76-3dd8c7577317> (10)

File "<ipython-input-76-3dd8c7577317>", line 10:
def numbaprocess_readable(array,index,coldict):
    if array[index,coldict['C']]>0.3:
    ^

This error may have been caused by the following argument(s):
- argument 2: cannot determine Numba type of <class 'dict'>

ПРИМЕЧАНИЕ: Я уже пробовал новые numba dicts, но они намного медленнее, чем python dicts. Я сэкономлю код, но для python dict требуется около 50 нс, чтобы вернуть против numba dict, занимающего 7 микросекунд. Мне нужно, чтобы этот простой процесс оставался ниже 1 микросекунды.

d = Dict.empty(
        key_type=types.unicode_type,
        value_type=types.uint,
        )
# Fill the dictionary
d['AssetId'] =0
d['Open'] = 1

ОБНОВЛЕНИЕ: Тем временем я пробовал структурированные массивы, которые допускают имена столбцов - доступ в 13 раз медленнее, чем доступ с использованием чисто числовых массивов. Так что не лучший вариант

array[0]['colC'] ## in my dataset (5 million) 13 times slower than:
array[0,3]  

Помимо этого неудачного подхода, существует ли эффективный способ ввода имен некоторых столбцов в функцию numba, которая работает с числовым массивом numpy?

...