Numba: преобразование массива numpy в хеш-объект - PullRequest
1 голос
/ 02 июля 2019

Внутри функции numba .jit(nopython=True) я вычисляю тысячи числовых массивов (1-D, целочисленный тип данных) и добавляю их в список.Проблема в том, что некоторые массивы выглядят одинаковыми, но мне не нужны дубликаты.Поэтому мне нужен эффективный способ проверить, существует ли новый массив в списке или нет.

В python это можно сделать так:

import numpy as np
import numba as nb

# @nb.jit(nopython=True)
def foo(n):

    uniques = []
    uniques_set = set()

    for _ in range(n):

        arr = np.random.randint(0, 2, 2)
        arr_hashable = make_hashable(arr)

        if not arr_hashable in uniques_set:
            uniques_set.add(arr_hashable)
            uniques.append(arr)

    return uniques

Я пробовал два способа решить эту проблему:

  1. Преобразование массива в кортеж и помещение кортежа внутри набора.

    def make_hashable(arr):
        return tuple(arr)
    

    но, к сожалению, прямое построение кортежа не работает таким образом в режиме nopython.Я пробовал также так:

    def make_hashable(arr):
        res = ()
        for n in arr:
            res += (n,)
        return res
    

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

  2. Преобразовать массив встрока и также положить его в набор.

    def make_hashable(arr):
        return arr.tostring()
    

    также перепробовал все возможные способы преобразования массива в строку, но кажется, что numba пока не поддерживает преобразование строки

Может быть, есть разные подходы для проверки (эффективно), если массив уже существует в списке?Моя версия Numba - 0,44.Большое спасибо.

...