Есть ли способ сделать мягкую ссылку или объект типа 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 будет размещен в несмежных блоках памяти, поэтому не будет возможности обратиться к их элементам, используя один набор шагов.

Другие вопросы по тегам