a[0],a[1]=a[1],a[0]的过程中发生了什么?
今天下午我发现了一个无法理解的现象。我想交换ndarray中的两行,如下代码所示。
import numpy as np
a = np.random.randint(0, 40, size=(4, 4))
a = a + a.T
b = a.copy()
print(a)
b[1], b[3] = b[3], b[1]
print(b)
但是一个意想不到的结果来了。打印结果如下
[[60 64 12 33]
[64 30 29 60]
[12 29 40 64]
[33 60 64 76]]
[[60 64 12 33]
[33 60 64 76]
[12 29 40 64]
[33 60 64 76]]
我知道 a,b = b,a 是有效的。我想知道它们之间有什么区别?你能从记忆的角度谈谈这个问题吗?提前谢谢你!
回答
b[3]并且b[1]是原始数组的视图。他们不会复制他们的数据。大多数时候这是你想要的。
因此,当您b[1], b[3] = b[3], b[1]首先写入时,第三行会分配给第一行,从而更改数组b。此时b[1]已更改,因此b[3] = b[1]发生时您的原始数据已消失。
b[[1, 3]] = b[[3, 1]] 做你想做的(也称为“花式指示”,这不会创建视图)。