numpy 为什么引用数组y成为数组x的副本,在x是例如,乘以标量[副本]

mwkjh3gx  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(105)

此问题已在此处有答案

Are numpy arrays passed by reference?(3个答案)
22天前关闭
在创建数组x并引用y之后,在单个索引处修改x(或y)将导致xy同时发生变化,而不是复制z

示例

创建一个数组x,引用y和副本z

x = np.array([1, 2, 3])
y = x
z = np.copy(x)

修改索引0处的数组:

x[0] =0
x
Out: array([0, 2, 3])
y
Out: array([0, 2, 3])
z
Out: array([1, 2, 3])

在这种情况下,xy共享相同的内存位置:

id(x)
Out: 2519145124656
id(y)
Out: 2519145124656
id(z)
Out: 2519145126192

当重复上面的示例时,但是现在通过执行例如对y进行向量-标量乘法复制而不引用。这似乎令人困惑。在这种情况下,为什么要复制而不是引用,有没有具体的原因?

x = np.array([1, 2, 3])
y = x
z = np.copy(x)

通过与标量2相乘来修改x

x = x * 2

x
Out: array([2, 4, 6])
y
Out: array([1, 2, 3])
z
Out: array([1, 2, 3])

xy不再共享相同的内存位置,尽管之前没有显式复制:

id(x)
Out: 2519145069712
id(y)
Out: 2519145224592
id(z)
Out: 2519145196400
jljoyd4f

jljoyd4f1#

  • 当您通过执行矢量标量乘法x = x * 2来修改数组x时,会在memory中创建一个new array来存储乘法结果。这个新数组被分配给变量x,而变量y仍然引用原始数组,并且不反映对x所做的更改。
  • 另一方面,当你在一个单一的索引modify x or y,两个变量仍然引用内存中的same array。这是因为修改单个索引不会创建new array,它只是修改了现有的数组。因此,x和y都反映了changes
  • 总而言之,生成copy还是reference取决于执行的特定操作,修改数组中的单个索引会修改原始数组,而执行创建新数组(如vector-scalar multiplication)的操作会导致创建新数组并将其分配给变量

相关问题