I'm having some strange behavior in my python code related to -
and -=
. I'm writing a QR decomposition using numpy, and have the following line of code in a double loop:
v = v - r[i,j] * q[:,i]
where q
and r
are both numpy.array
, and v
is a slice of another numpy.array
taken as v = x[:,j]
.
The above code doesn't work as expected in all cases. However, if I make the following change:
v -= r[i,j] * q[:,i]
Then everything works flawlessly.
I was under the impression that those two lines should be identical. To test whether -=
and _ = _ -
were working differently, I created the following snippet
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
which again works as expected, producing [2 3] [2 3]
at both print statements.
So I'm entirely confused why those two lines perform differently. The only possible thing I can think of is that I am dealing with extremely small numbers sometimes (on the order of 10^-8 or smaller) and there is some precision issue that -=
is better at? The first line performs increasingly worse as the elements of x
get smaller.
I apologize if there's any other posts about this similar issue, I can't search for -
and -=
and I don't know if there's any correct terms for these besides assignment/operators.
Thanks for any help!
In numpy, += is implemented to do in memory changes, while + returns a new array.
In NumPy, the @ operator means matrix multiplication. If you are familiar with matrix multiplication, I'm sure this answers your questions.
rpy2 has features to ease bidirectional communication with numpy .
When v
is a slice, then v -= X
and v = v - X
produce very different results. Consider
>>> x = np.arange(6)
>>> v = x[1:4]
>>> v -= 1
>>> v
array([0, 1, 2])
>>> x
array([0, 0, 1, 2, 4, 5])
where v -= 1
updates the slice, and therefore the array that it views, in-place, vs.
>>> x = np.arange(6)
>>> v = x[1:4]
>>> v = v - 1
>>> v
array([0, 1, 2])
>>> x
array([0, 1, 2, 3, 4, 5])
where v = v - 1
resets the variable v
while leaving x
untouched. To obtain the former result without -=
, you'd have to do
v[:] = v - 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With