我试图使用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发布于 2021-10-11 10:40:29
来自关于切片的文档(重点是我的):
注意,数组片并不复制内部数组数据,而是只生成原始数据的新视图。--这与列表或元组切片不同,如果不再需要原始数据,建议使用显式副本()。
所以就这么做吧:
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]注意,ids不同的原因是因为b是a的视图,实际上是一个不同的对象。
发布于 2021-10-11 10:40:50
numpy中的操作符[:]不复制数据,而是复制引用。所以这种行为是预料之中的。这与直接执行a = b相同。使用np.copy(array)复制值。
如果有数组a = [1, 2]和空变量b,那么numpy数组的赋值行为总结如下:
b,它也将更改a。b = a
b[1] = 10
print(b == a) # Trueb = a[:]
b[1] = 10
print(b == a) # Trueb,则a不会更改。b = np.copy(a)
b[1] = 10
print(b == a) # True...and如果dtype=object,使用deepcopy()从包copy将确保所有的值被复制。
b = copy.deepcopy(a)
b[1] = 10
print(b == a) # Truehttps://stackoverflow.com/questions/69524780
复制相似问题