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