我最近应用了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数组无效?
发布于 2016-01-27 19:37:15
在内部,区别在于:
a[1:] -= a[:-1]
等同于:
a[1:] = a[1:].__isub__(a[:-1])
a.__setitem__(slice(1, None, None), a.__getitem__(slice(1, None, None)).__isub__(a.__getitem__(slice(1, None, None)))
而这一点:
b[1:] = b[1:] - b[:-1]
映射到以下内容:
b[1:] = b[1:].__sub__(b[:-1])
b.__setitem__(slice(1, None, None), b.__getitem__(slice(1, None, None)).__sub__(b.__getitem__(slice(1, None, None)))
在某些情况下,__sub__()
和__isub__()
的工作方式类似。但是在使用__isub__()
时,可变对象应该发生变化并返回自身,而使用__sub__()
时,它们应该返回一个新对象。
对numpy对象应用切片操作会在它们上创建视图,因此使用它们可以直接访问“原始”对象的内存。
https://stackoverflow.com/questions/35036126
复制相似问题