Использовать массив NumPy в качестве ключа в Numba TypedDict

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


person Zachary Matson    schedule 18.04.2020    source источник
comment
Покажите нам проверенный вами код, который Numba отклоняет.   -  person J_H    schedule 18.04.2020
comment
У меня действительно нет подходящего кода для публикации, который, к сожалению, говорит больше, чем исходный пост, но немного теряет то, что нужно попробовать   -  person Zachary Matson    schedule 19.04.2020


Ответы (2)


Если ваши массивы 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])
person Matt Eding    schedule 18.04.2020

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

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

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

person Ralvi Isufaj    schedule 18.04.2020