我试图使用[:]对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不同的原因是b
是a
的视图,实际上是一个不同的对象。
numpy中的[:]
操作符不复制数据,而是复制引用。所以这种行为是意料之中的。这和直接处理a = b
是一样的。使用np.copy(array)
复制值
如果有数组a = [1, 2]
和空变量b
,那么numpy数组的赋值行为总结为:
- 这些类型的赋值会复制引用,所以如果你稍后更改
b
,它也会更改a
。
b = a
b[1] = 10
print(b == a) # True
b = a[:]
b[1] = 10
print(b == a) # True
- 这种赋值会复制的值,所以如果你更改
b
,a
不会改变。
b = np.copy(a)
b[1] = 10
print(b == a) # True
…如果dtype=object
,使用从包copy
deepcopy()
将确保所有的值复制。
b = copy.deepcopy(a)
b[1] = 10
print(b == a) # True