Python中的 – = b和a = a – b之间的区别

问题:

我最近应用了this求解每N行矩阵的平均值。
虽然解决方案一般工作,但是当应用于7×1阵列时,我遇到了问题。我注意到使用-=运算符时出现问题。
举一个小例子:

import numpy as np

a = np.array([1,2,3])
b = np.copy(a)

a[1:] -= a[:-1]
b[1:] = b[1:] - b[:-1]

print a
print b

其输出:

[1 1 2]
[1 1 1]

所以,在数组a -= b的情况下产生与a = a - b不同的结果。直到现在,我都认为这两种方式是完全一样的。有什么不同?
我提到的方法是为了对矩阵中的每N行进行求和来实现。对于7×4阵列而不是7×1阵列?

回答:

 Note: using in-place operations on NumPy arrays that share memory in no longer a problem in version 1.13.0 onward (see details here). The two operation will produce the same result. This answer only applies to earlier versions of NumPy.
在计算中使用突变阵列可能会导致意想不到的结果!
在该问题的例子中,使用-=的减法修改a的第二个元素,然后在a的第三个元素的操作中立即使用modified第二个元素
以下是a[1:] -= a[:-1]一步一步的发生:

  •  a是数据[1, 2, 3]的数组
  • 我们对这些数据有两个视图:a[1:][2, 3]a[:-1][1, 2]
  • 就地减法-=开始。 a[:-1],1的第一个元素从a[1:]的第一个元素中减去。这将a修改为[1, 1, 3]。现在我们有a[1:]是数据[1, 3]的视图,a[:-1]是数据[1, 1]的视图(数组a的第二个元素已经被改变)。
  •  a[:-1]现在是[1, 1],NumPy现在必须从a[1:]的第二个元素中减去第二个元素which is 1(不再是2)。这使得a[1:]查看值[1, 2]
  •  a现在是值为[1, 1, 2]的数组

 b[1:] = b[1:] - b[:-1]没有此问题,因为b[1:] - b[:-1]首先创建一个new数组,然后将该数组中的值分配给b[1:]。它在减法期间不修改b本身,所以视图b[1:]b[:-1]不会改变。
一般的建议是避免修改一个视图与另一个视图重叠。这包括运算符-=*=等,并在通用函数(如np.subtractnp.multiply)中使用out参数写回到其中一个数组。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Difference between a -= b and a = a – b in Python

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

9 + 1 =