Как сдвинуть содержимое, на которое ссылаются пустые имена массивов в python - PullRequest
0 голосов
/ 08 ноября 2018

В Python у меня есть numy массивы a0, a1 и a2, каждый из которых относится к разному содержимому. Я хочу изменить отношения между именами ссылок и ссылочными объектами, чтобы a2 теперь указывал на контент, на который указывает a1 ранее, а a1 теперь будет указывать на контент, на который указывает a0 ранее. Затем я хочу позволить a0 указать на новый контент.

Чтобы быть более конкретным, я хочу сделать что-то вроде этого:

import numpy as np
a2=np.array([1,2,3,4])
a1=np.array([10,20,30,40])
a0=np.array([8,8,8,8]) 
a2=a1
a1=a0
# I want to assign new values to a0[0], a0[1], .., without affecting a1. 

Можно ли сделать это без копирования значений (например, np.copy) и без перераспределения памяти (например, del и np.empty)?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

То, что вы спрашиваете, невозможно без создания копии a0, иначе a0 и a1 будут указывать на один и тот же объект, и изменение a0 изменит a1. Итак, вы должны сделать это:

a2 = np.array([1,2,3,4])
a1 = np.array([10,20,30,40])
a0 = np.array([8,8,8,8]) 

a2 = a1
a1 = a0.copy()

# let's change a0
a0[0] = 9

# check
a0
Out[31]: array([9, 8, 8, 8])

a1
Out[32]: array([8, 8, 8, 8])

a2
Out[33]: array([10, 20, 30, 40])
0 голосов
/ 08 ноября 2018

Использование распаковки кортежей для обмена значениями вроде a,b=b,a

In [183]: a2=np.array([1,2,3,4])
     ...: a1=np.array([10,20,30,40])
     ...: a0=np.array([8,8,8,8]) 
     ...: 
     ...: 

In [184]: 


In [185]: a2,a1=np.copy(a1),np.copy(a0)

In [186]: a0
Out[186]: array([8, 8, 8, 8])

In [187]: a1
Out[187]: array([8, 8, 8, 8])

In [188]: a2
Out[188]: array([10, 20, 30, 40])

Вы можете указывать a0, где хотите, и я не думаю, что вы можете создать безнаказанное изменение a0, не влияющее на a1 без np.copy или чем-то еще, например copy.deepcopy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...