Существует ли какой-либо способ сделать мягкие ссылки или указательные объекты, используя массивы 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]),)
Я думаю, что фундаментальная проблема с тем, что вы просите, заключается в том, что массивы numpy должны быть поддержаны непрерывным блоком памяти, который может быть регулярно шагать, чтобы сопоставить адреса памяти отдельным элементам массива.В вашем примере
a
иb
будут выделены в несмежных блоках памяти, так что не будет никакого способа обратиться к их элементам, используя один набор шагов.