python 数组赋值与标量赋值
python assignment in array vs scalar
我有一个形状为 (4,3)
的二维数组 A
和一个形状为 (4,)
的一维数组 a
。我想交换 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
切片是底层内存的 视图 ,它们默认不创建独立副本(这是 performance/memory 优化)。所以:
A[0,:],A[1,:] = A[1,:],A[0,:]
创建 A[1,:]
视图和 A[0,:]
视图,然后将 A[0,:]
的值分配给 A[1,:]
视图中的值。但是当它开始分配 A[1,:]
时,A[0,:]
的视图现在显示 post-copy 数据,所以你得到了不正确的结果。在这种情况下,只需将 .copy
添加到此处的第二个元素就足够了:
A[0,:], A[1,:] = A[1,:], A[0,:].copy()
因为右边的元组总是在左边的赋值开始之前构建完成,所以你可以使用实时视图进行第一次赋值,而只需要制作一个副本来保留第二次赋值的值。
我有一个形状为 (4,3)
的二维数组 A
和一个形状为 (4,)
的一维数组 a
。我想交换 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
切片是底层内存的 视图 ,它们默认不创建独立副本(这是 performance/memory 优化)。所以:
A[0,:],A[1,:] = A[1,:],A[0,:]
创建 A[1,:]
视图和 A[0,:]
视图,然后将 A[0,:]
的值分配给 A[1,:]
视图中的值。但是当它开始分配 A[1,:]
时,A[0,:]
的视图现在显示 post-copy 数据,所以你得到了不正确的结果。在这种情况下,只需将 .copy
添加到此处的第二个元素就足够了:
A[0,:], A[1,:] = A[1,:], A[0,:].copy()
因为右边的元组总是在左边的赋值开始之前构建完成,所以你可以使用实时视图进行第一次赋值,而只需要制作一个副本来保留第二次赋值的值。