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


person Alejandro    schedule 21.04.2015    source источник
comment
Нет не может... Вы можете сделать это наоборот, т.е. сгенерировать срезы a и b из ранее определенного c, так что при предварительном планировании вы можете получить то, что хотите. Но не постфактум.   -  person Jaime    schedule 21.04.2015
comment
Это действительно интересно, но у меня есть a и b по определению моей проблемы. Спасибо   -  person Alejandro    schedule 21.04.2015


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

person ali_m    schedule 21.04.2015
comment
Спасибо за ваш ответ, но мне кажется, что должен быть способ определить массив указателей. Очень полезно знать, как определять указатели в Python. Есть ли способ сделать это? - person Alejandro; 22.04.2015
comment
Это зависит от того, что именно вы подразумеваете под массивом указателей. Как я уже объяснял, расположение массивов numpy во внутренней памяти означает, что вы определенно не можете создать новый массив numpy, который ссылается на значения в двух существующих массивах, которые были выделены отдельно. Я думаю, что это может быть проблема XY - что именно вам нужно массив указателей за? - person ali_m; 22.04.2015
comment
Под массивом указателей я подразумеваю такой массив, каждый элемент которого указывает на другой адрес памяти. Но я думаю, что вы правы, это невозможно. В любом случае, ваш пример был действительно очень интересным. Спасибо! - person Alejandro; 23.04.2015
comment
Мой вопрос был действительно о том, почему вам нужен такой массив. Я вижу, вы все равно приняли мой ответ, но если вы хотите задать отдельный дополнительный вопрос, я настоятельно рекомендую вам более подробно объяснить предысторию вашей проблемы - возможно, есть хороший способ решить ее с помощью numpy, но нам нужно чтобы узнать, в чем заключается ваша реальная проблема, а не просто конкретное решение, которое вы имели в виду. - person ali_m; 23.04.2015