我正在尝试减少代码中的复制量,并且在处理 numpy 数组切片和视图时遇到了令人惊讶的行为,如下所述:
我偶然发现了以下行为,这对我来说是出乎意料的:
情况1。:
import numpy as np
a = np.ones((3,3))
b = a[:,1:2]
b += 5
print a
print b.base is a
正如预期的那样,这输出:
array([[ 1., 6., 1.],
[ 1., 6., 1.],
[ 1., 6., 1.]])
True
案例 2:在一行中执行切片和添加时,情况看起来有所不同:
import numpy as np
a = np.ones((3,3))
b = a[:,1:2] + 5
print a
print b.base is a
令我惊讶的部分是 a[:,1:2] 似乎没有创建视图,然后将其用作左侧参数,因此,输出:
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
False
也许有人可以阐明为什么这两种情况不同,我想我遗漏了一些东西。
解决方案:我错过了一个明显的事实,即“+”运算符,而不是就地运算符“+=”将始终创建一个副本,因此它实际上不相关,而是切片,而不是如何为 numpy 定义就地运算符数组。
为了说明这一点,以下生成与案例 2 相同的输出:
import numpy as np
a = np.ones((3,3))
b = a[:,1:2]
b = b + 5
print a
print b.base is a