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