Есть ли способ сделать мягкую ссылку или объект типа Pointer, используя массивы Numpy?
Мне было интересно, есть ли способ ссылаться на данные из разных массивов в одном массиве, но без их копирования.
Пример:
import numpy as np
a = np.array([2,3,4,5,6])
b = np.array([5,6,7,8])
c = np.ndarray([len(a)+len(b)])
offset = 0
c[offset:offset+len(a)] = a
offset += len(a)
c[offset:offset+len(b)] = b
Однако в приведенном выше примере c
новый массив, так что если вы измените какой-то элемент a
или же b
, это не изменено в c
совсем.
Я хотел бы, чтобы каждый индекс c
(т.е. c[0]
, c[1]
и т. д.) относятся к каждому элементу обоих a
а также b
, но, как указатель, не делая deepcopy
данных.
1 ответ
Как говорит @Jaime, вы не можете сгенерировать новый массив, содержимое которого указывает на элементы в нескольких существующих массивах, но вы можете сделать наоборот:
import numpy as np
c = np.arange(2, 9)
a = c[:5]
b = c[3:]
print(a, b, c)
# (array([2, 3, 4, 5, 6]), array([5, 6, 7, 8]), array([2, 3, 4, 5, 6, 7, 8]))
b[0] = -1
print(c,)
# (array([ 2, 3, 4, -1, 6, 7, 8]),)
Я думаю, что основная проблема в том, что вы просите, состоит в том, что массивные массивы должны поддерживаться непрерывным блоком памяти, который можно регулярно перемещать, чтобы отобразить адреса памяти для отдельных элементов массива.
В вашем примере a
а также b
будет размещен в несмежных блоках памяти, поэтому не будет возможности обратиться к их элементам, используя один набор шагов.