我有一个2D阵列 A 形状的 (4,3) ,以及1D阵列 a 形状的 (4,) . 我想交换前两行 A. ,以及 一 . 我做了以下工作:
A
(4,3)
a
(4,)
A.
一
A[0,:],A[1,:] = A[1,:],A[0,:] a[0],a[1] = a[1],a[0]
显然,它对 一 ,但失败 A. . 现在,第二行变为第一行,但第一行保持不变。如果我执行以下操作:
first_row_copy = A[0,:].copy() A[0,:] = A[1,:] A[1,:] = first_row_copy
然后,它似乎奏效了。为什么第一种方法不起作用?(但适用于 一 )还有,两者的区别是什么 A_copy = A[0,:].copy() 和 A_copy = A[0,:] ?
A_copy = A[0,:].copy()
A_copy = A[0,:]
numpy 切片是 意见 默认情况下,它们不会创建独立的拷贝(这是一种性能/内存优化)。因此:
numpy
A[0,:],A[1,:] = A[1,:],A[0,:]
查看 A[1,:] 以及 A[0,:] ,然后指定 A[0,:] 等于所看到的 A[1,:] . 但当它开始分配 A[1,:] , A[0,:] 的视图现在显示复制后数据,因此您得到的结果不正确。只需添加 .copy 在这种情况下,这里的第二个元素就足够了:
A[1,:]
A[0,:]
.copy
A[0,:], A[1,:] = A[1,:], A[0,:].copy()
因为右侧的元组总是在左侧的赋值开始之前完全构建,所以您可以在第一次赋值时使用实时视图,只需制作副本即可保留第二次赋值的值。