Используйте массив NumPy в качестве ключа в Numba TypedDict - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь изменить класс для использования @jitclass Numba, и часть этого класса должна сопоставить массивы NumPy с значениями int, используя словарь. Я использовал метод tobytes массивов в качестве ключа, но этот метод не поддерживается в Numba. Есть ли совместимый с Numba способ ввода словаря с массивами NumPy? Строковый метод для массивов также, кажется, не поддерживается в Numba.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Без такой большой информации, чтобы включить go, я бы предложил сначала сопоставить ваши массивы с промежуточным словарем, например так:

list_of_arrays = [arr1, arr2, arr3]
intermediate_dict = {x:y for x,y in enumerate(list_of_arrays)}

, а затем, после того, как вы закончите, объединить это смещение с полученным словарь для получения необходимой информации.

0 голосов
/ 19 апреля 2020

Если ваши NumPy массивы не меняют адреса памяти, вы можете создать ключ на основе указателей на их адрес памяти. Обратите внимание, что это применимо только в том случае, если массив нужно изменить на месте:

>>> import numpy as np
>>> arr = np.arange(3)
>>> arr
array([0, 1, 2])
>>> ptr, _ = arr.__array_interface__['data']
>>> ptr
140556718588416
>>> dct = {ptr: arr}
>>> dct[ptr]
array([0, 1, 2])
>>> arr += 10
>>> dct[ptr]
array([10, 11, 12])
>>> arr[...] = 0
>>> dct[ptr]
array([0, 0, 0])

Но если вы на самом деле измените расположение памяти в массиве, вы столкнетесь с ошибками:

>>> arr = np.ones_like(arr)
>>> arr
array([1, 1, 1])
>>> dct[ptr] # oops!
array([0, 0, 0])
...