为什么引用数组 y 会成为数组 x 的副本,例如 x 之后乘以标量?

问题描述 投票:0回答:1

创建数组 x 并引用 y 后,在单个索引处修改 x(或 y)将导致 x 和 y 同时更改,与副本 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])

在这种情况下x和y共享相同的内存位置

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

当重复上面的示例时,但现在通过执行例如修改引用 x向量标量乘法对 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])

x 和 y 不再共享相同的内存位置,尽管之前没有进行显式复制

id(x)
Out: 2519145069712
id(y)
Out: 2519145224592
id(z)
Out: 2519145196400
python numpy copy variable-assignment
1个回答
0
投票
  • 当您通过执行矢量标量乘法
    x
    来修改数组
    x = x * 2
    时,会在
    new array
    中创建一个
    memory
    来存储乘法结果。这个新数组被分配给变量
    x
    ,而变量
    y
    仍然引用原始数组,并且不反映对x所做的更改。
  • 另一方面,当您在单个索引处
    modify x or y
    时,两个变量仍然引用内存中的
    same array
    。这是因为修改单个索引不会创建
    new array
    ,它只是修改现有数组。因此,x 和 y 都反映了所做的
    changes
  • 总而言之,是否创建
    copy
    reference
    取决于所执行的具体操作,修改数组中的单个索引会在执行创建新数组的操作时就地修改原始数组(例如
    vector-scalar multiplication
    )导致创建一个新数组并将其分配给变量
© www.soinside.com 2019 - 2024. All rights reserved.