我有一个二维数组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,:] 之间有什么区别?
请您参考如下方法:
numpy 切片是底层内存的 View ,默认情况下它们不创建独立副本(这是性能/内存优化)。所以:
A[0,:],A[1,:] = A[1,:],A[0,:]
创建A[1,:] View 和A[0,:] View ,然后分配A[0, :] 等于 A[1,:] 的 View 。但是当它开始分配 A[1,:] 时,A[0,:] 的 View 现在显示复制后的数据,所以你得到不正确的结果。在这种情况下,只需将 .copy 添加到此处的第二个元素就足够了:
A[0,:], A[1,:] = A[1,:], A[0,:].copy()
因为右边的元组总是在左边的赋值开始之前完成构建,所以您可以使用实时 View 进行第一个赋值,只需要制作一个副本来保留第二个赋值的值。
