- vs - =有numpy的运算符

Jos*_*osh 13 python numpy

我有我的关系到Python代码一些奇怪的行为--=.我正在使用numpy编写QR分解,并在双循环中使用以下代码行:

v = v - r[i,j] * q[:,i]
Run Code Online (Sandbox Code Playgroud)

在哪里qr都是numpy.array,并且v是另一个numpy.array被视为的片段v = x[:,j].

在所有情况下,上述代码都无法正常工作.但是,如果我做出以下更改:

v -= r[i,j] * q[:,i]
Run Code Online (Sandbox Code Playgroud)

然后一切都完美无瑕.

我的印象是这两行应该是相同的.为了测试是否-=以及_ = _ - 以不同的方式工作,我创建了以下代码段

import numpy

x = numpy.array(range(0,6))
y = numpy.array(range(0,6))

u = x[3:5]
v = y[3:5]

print u,v

u = u - [1,1]
v -= [1,1]

print u,v
Run Code Online (Sandbox Code Playgroud)

它再次按预期工作,[2 3] [2 3]在两个印刷声明中生成.

所以我完全混淆了为什么这两行表现不同.我能想到的唯一可能的事情是我有时会处理极小的数字(大约10 ^ -8或更小)并且有一些更精确的问题-=?随着元素x变小,第一行的表现越来越差.

我很抱歉,如果有这个类似的问题,任何其他职位,我不能搜索--=我不知道是否有任何一个正确的术语,这些除了分配/运营商.

谢谢你的帮助!

Fre*_*Foo 22

如果v是一个切片,然后v -= Xv = v - X产生非常不同的结果.考虑

>>> x = np.arange(6)
>>> v = x[1:4]
>>> v -= 1
>>> v
array([0, 1, 2])
>>> x
array([0, 0, 1, 2, 4, 5])
Run Code Online (Sandbox Code Playgroud)

在哪里v -= 1更新切片,因此更新它所查看的数组,就地,与

>>> x = np.arange(6)
>>> v = x[1:4]
>>> v = v - 1
>>> v
array([0, 1, 2])
>>> x
array([0, 1, 2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)

其中v = v - 1重置变量v而保持x不变.要获得前一个结果-=,你必须这样做

v[:] = v - 1
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 12

你可以从你得到不同的结果x - yx -= y如果数据类型xy不同.

例如:

import numpy as np

x = np.array(range(0,6))
y = np.array(np.arange(0,3,0.5))

print x - y
x -= y
print x
Run Code Online (Sandbox Code Playgroud)

打印出:

[ 0.   0.5  1.   1.5  2.   2.5]
[0 0 1 1 2 2]
Run Code Online (Sandbox Code Playgroud)

可能值得确保您的数组dtypes完全符合您的预期(例如,您不是无意中使用整数或float32数组而是float64),特别注意在左侧使用的数组-=.

  • +1 即使事实证明这不是原因;我完全忽略了这种可能性,也不应该。 (2认同)

Bi *_*ico 5

对这个问题的其他两个答案+1。它们涵盖了=和之间的两个重要区别,-=但我想再强调一个。大多数时间x -= y与相同x[:] = x - y,但当xy是同一数组的分片时则不同。例如:

x = np.ones(10)
y = np.ones(10)

x[1:] += x[:-1]
print x
[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.]

y[1:] = y[1:] + y[:-1]
print y
[ 1.  2.  2.  2.  2.  2.  2.  2.  2.  2.]
Run Code Online (Sandbox Code Playgroud)