数组中的python赋值与标量

时间:2017-12-30 02:02:19

标签: python arrays numpy variable-assignment copy-assignment

我有一个形状为A的二维数组(4,3),以及一个形状为a的一维数组(4,)。我想交换A的前两行,以及a中的前两行。我做了以下事情:

A[0,:],A[1,:] = A[1,:],A[0,:]
a[0],a[1] = a[1],a[0]

显然,它适用于a,但A失败。现在,第二行成为第一行,但第一行保持不变。如果我执行以下操作:

first_row_copy = A[0,:].copy()
A[0,:] = A[1,:]
A[1,:] = first_row_copy

然后,它似乎工作。为什么第一种方法不起作用? (但适用于a)另外,A_copy = A[0,:].copy()A_copy = A[0,:]之间有什么区别?

1 个答案:

答案 0 :(得分:5)

numpy个切片是底层内存的 views ,默认情况下它们不会创建独立的副本(这是性能/内存优化)。所以:

A[0,:],A[1,:] = A[1,:],A[0,:]

查看A[1,:]视图和A[0,:]视图,然后将A[0,:]的值指定为等于A[1,:]视图中的值。但是当它分配A[1,:]时,A[0,:]的视图现在显示了复制后数据,因此您得到的结果不正确。在这种情况下,只需将.copy添加到第二个元素即可:

A[0,:], A[1,:] = A[1,:], A[0,:].copy()

因为右侧的元组总是在左侧开始分配之前完全构造,因此您可以使用实时视图进行第一次分配,并且只需要复制以保留第二次分配的值。