- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我最近申请了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.subtract
和 np.multiply
) 写回数组之一。
关于python - Python中a -= b和a = a - b之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35036126/
我是一名优秀的程序员,十分优秀!