Numpy数组:尽管A = B[:]创建Numpy数组对象id (A) ! = id (B).它仍



我试图使用[:]对numpy数组进行浅拷贝,就像我通常对列表所做的那样。然而,我发现这与列表的行为不同。我知道我可以使用。copy()方法来解决这个问题。但我只是想知道这个笨蛋到底是怎么回事。谁能详细说明一下。

import numpy as np
a = np.array([1,2,3,4,5])
b = a[:]
print(id(b) == id(a))  # Ids are different, So different objects right ?
b[3] = 10
print(a, b) # Both a and b got updated

来自关于切片的文档(重点是我的):

注意,数组的切片不复制内部数组数据,而是只生成原始数据的新视图。这与列表或元组切片并且建议使用显式copy()不再需要原始数据。

那么就这样做:

import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = a.copy()
b[3] = 10
print(a, b)

[1 2 3 4 5] [ 1  2  3 10  5]

请注意,id不同的原因是ba的视图,实际上是一个不同的对象。

numpy中的[:]操作符不复制数据,而是复制引用。所以这种行为是意料之中的。这和直接处理a = b是一样的。使用np.copy(array)复制值

如果有数组a = [1, 2]和空变量b,那么numpy数组的赋值行为总结为:

  1. 这些类型的赋值会复制引用,所以如果你稍后更改b,它也会更改a
b = a
b[1] = 10
print(b == a) # True
b = a[:]
b[1] = 10
print(b == a) # True
  1. 这种赋值会复制的值,所以如果你更改b,a不会改变。
b = np.copy(a)
b[1] = 10
print(b == a) # True

…如果dtype=object,使用从包copydeepcopy()将确保所有的值复制。

b = copy.deepcopy(a)
b[1] = 10
print(b == a) # True