我应该何时使用.copy()

2024-04-25 01:33:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道,由于以下原因:

a=1
b=a
a=4

它将1分配给a,然后a分配给b,最后一步是将a的值更改为4 这里,一旦a的值更改为4,则b的值不会有任何更改

同样适用于

a=np.array([10,20,30,40,50,60])
b=a[2]

a[2]=100

代码末尾的b值将是20,它是初始的a[2]

但当你有一些事情,如下面所述:

a=np.array([10,20,30,40,50,60])
b=a[0:2]

如果我们改变a[0:2]=[100,200],那么b的值也会自动改变。这就像变量b以某种方式与其他变量相关联(这与之前的情况不同)。
我知道如果代码被写成b=a[0:2].copy(),那么b就不会改变,即使a被改变了

所以我的问题是,如果我不想更改后一个变量,因为在前两种情况下没有必要,那么我应该在哪里使用这个.copy()方法

谢谢你的帮助


Tags: 方法代码np方式情况原因事情array
1条回答
网友
1楼 · 发布于 2024-04-25 01:33:23

第一,;第二种情况是,为b指定了一个值(标量)

在第三种情况下,您已经基于a的切片0:2b分配了一个view(请参见basic-slicing-and-indexing)。这本质上是对a的某些元素的多值引用(即:b[0]实际上指的是a[0])。换句话说,b不拥有它的数据,但是指向a中的数据。因此,当更改a时,b只反映这些更改,因为它指向非常相同的元素

通常,当您要将副本与原始副本分离时,应使用numpycopy(),例如:

  1. 当您准备对副本进行修改时(例如,偷偷改变调用方的数据并不酷)
  2. 当您希望在该点保留阵列的快照时,无论以后原始阵列发生什么情况
  3. 当您使用非常稀疏的切片或随机顺序,并且希望获得更紧凑的副本以实现更快的操作(参考位置)时
  4. 当您想更改ab的标志时(例如,从C连续到F连续,通常也是出于速度原因)

关于您在评论中提出的问题,“是否有任何方法可以确定变量是否相互关联”:是的。每个numpy数组都有flags

a=np.array([10,20,30,40,50,60])
b=a[2]
b.flags.owndata
# True    funny given that b is a single numpy.int64, but it still has flags

b=a[0:2]
b.flags.owndata
# False

a=np.array([10,20,30,40,50,60])
b=a[0:2].copy()
b.flags.owndata
# True

相关问题 更多 >