Внутри функции 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
Я пробовал два способа решить эту проблему:
Преобразование массива в кортеж и помещение кортежа внутри набора.
def make_hashable(arr):
return tuple(arr)
но, к сожалению, прямое построение кортежа не работает таким образом в режиме nopython.Я пробовал также так:
def make_hashable(arr):
res = ()
for n in arr:
res += (n,)
return res
и другие подобные обходные пути, которые я мог придумать, но все они потерпели неудачу в режиме nopython с TypeError.
Преобразовать массив встрока и также положить его в набор.
def make_hashable(arr):
return arr.tostring()
также перепробовал все возможные способы преобразования массива в строку, но кажется, что numba пока не поддерживает преобразование строки
Может быть, есть разные подходы для проверки (эффективно), если массив уже существует в списке?Моя версия Numba - 0,44.Большое спасибо.