Существует ли какой-либо способ сделать мягкие ссылки или указательные объекты, используя массивы 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 5

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]),)

Я думаю, что фундаментальная проблема с тем, что вы просите, заключается в том, что массивы numpy должны быть поддержаны непрерывным блоком памяти, который может быть регулярно шагать, чтобы сопоставить адреса памяти отдельным элементам массива.

В вашем примере a и b будут выделены в несмежных блоках памяти, так что не будет никакого способа обратиться к их элементам, используя один набор шагов.