我有我的关系到Python代码一些奇怪的行为-
和-=
.我正在使用numpy编写QR分解,并在双循环中使用以下代码行:
v = v - r[i,j] * q[:,i]
Run Code Online (Sandbox Code Playgroud)
在哪里q
和r
都是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 -= X
和v = 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 - y
和x -= y
如果数据类型x
和y
不同.
例如:
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。它们涵盖了=
和之间的两个重要区别,-=
但我想再强调一个。大多数时间x -= y
与相同x[:] = x - y
,但当x
和y
是同一数组的分片时则不同。例如:
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)
归档时间: |
|
查看次数: |
2763 次 |
最近记录: |