gpt4 book ai didi

python - Python中a -= b和a = a - b之间的区别

转载 作者:IT老高 更新时间:2023-10-28 21:10:11 25 4
gpt4 key购买 nike

我最近申请了this平均每 N 行矩阵的解决方案。尽管该解决方案通常有效,但在应用于 7x1 阵列时我遇到了问题。我注意到问题出在使用 -= 运算符时。举个小例子:

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 行求和的方法是如何起作用的,例如对于 7x4 矩阵而不是 7x1 数组?

最佳答案

注意:在 1.13.0 以后的版本中,在共享内存的 NumPy 数组上使用就地操作不再是问题(请参阅详细信息 here)。这两个操作将产生相同的结果。此答案仅适用于早期版本的 NumPy。


在计算中使用数组变异可能会导致意想不到的结果!

在问题的示例中,使用 -= 进行减法会修改 a 的第二个元素,然后立即使用 modified 中的第二个元素a的第三个元素的操作。

以下是 a[1:] -= a[:-1] 的步骤:

  • a 是数据为 [1, 2, 3] 的数组。

  • 我们对这个数据有两个 View :a[1:][2, 3]a[:-1] [1, 2]

  • 就地减法 -= 开始。 a[:-1] 的第一个元素 1 从 a[1:] 的第一个元素中减去。这已将 a 修改为 [1, 1, 3]。现在我们有 a[1:] 是数据 [1, 3] 的 View ,而 a[:-1] 是数据 [1, 1] 的 View (数组 a 的第二个元素已更改)。

  • a[:-1] 现在是 [1, 1] 并且 NumPy 现在必须减去它的第二个元素 ,即 1(不再是 2!)来自 a[1:] 的第二个元素。这使得 a[1:] 成为值 [1, 2] 的 View 。

  • a 现在是一个数组,其值为 [1, 1, 2]

b[1:] = b[1:] - b[:-1] 没有这个问题,因为b[1:] - b[:-1] 首先创建一个 new 数组,然后将该数组中的值分配给 b[1:]。它不会在减法过程中修改 b 本身,因此 View b[1:]b[:-1] 不会改变。


一般建议是避免在一个 View 与另一个 View 重叠时就地修改它们。这包括运算符 -=*= 等以及在通用函数中使用 out 参数(如 np.subtractnp.multiply) 写回数组之一。

关于python - Python中a -= b和a = a - b之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35036126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com