数组与标量中的python赋值

Phy*_*ist 1 python arrays numpy variable-assignment copy-assignment

我有一个2D数组A形状(4,3)和一维a形状的数组(4,).我想交换前两行A,以及前两行中的元素a.我做了以下事情:

A[0,:],A[1,:] = A[1,:],A[0,:]
a[0],a[1] = a[1],a[0]
Run Code Online (Sandbox Code Playgroud)

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

first_row_copy = A[0,:].copy()
A[0,:] = A[1,:]
A[1,:] = first_row_copy
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ger 5

numpyslice是底层内存的视图,默认情况下它们不会创建独立的副本(这是性能/内存优化).所以:

A[0,:],A[1,:] = A[1,:],A[0,:]
Run Code Online (Sandbox Code Playgroud)

制作视图A[1,:]和视图A[0,:],然后指定值A[0,:]等于视图中的值A[1,:].但是当它进行分配时A[1,:],A[0,:]现在的视图显示了复制后数据,因此您得到的结果不正确..copy在这种情况下,仅仅添加到第二个元素就足够了:

A[0,:], A[1,:] = A[1,:], A[0,:].copy()
Run Code Online (Sandbox Code Playgroud)

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