Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python and numpy : subtracting line by line a 2-dim array from a 1-dim array

In python, I wish to subtract line by line a 2-dim array from a 1-dim array.

I know how to do it with a 'for' loop and indexes but I suppose it may be quicker to use numpy functions. However I did not find a way to do it. Here is an example with a 'for' loop :

from numpy import *
x=array([[1,2,3,4,5],[6,7,8,9,10]])
y=array([20,10])
j=array([0, 1])
a=zeros([2,5])
for i in j :
...     a[i]=y[i]-x[i]

And here is an example of something that does not work, replacing the 'for' loop by this:

a=y[j]-x[j,i]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

Dou you have suggestions ?

like image 848
Moi Jaiunvelo Avatar asked Jan 17 '23 22:01

Moi Jaiunvelo


2 Answers

The problem is that y-x have the respective shapes (2) (2,5). To do proper broadcasting, you'll need shapes (2,1) (2,5). We can do this with .reshape as long as the number of elements are preserved:

y.reshape(2,1) - x

Gives:

array([[19, 18, 17, 16, 15],
   [ 4,  3,  2,  1,  0]])
like image 75
Hooked Avatar answered Jan 31 '23 09:01

Hooked


y[:,newaxis] - x 

should work too. The (little) comparative benefit is then you pay attention to the dimensions themselves, instead of the sizes of dimensions.

like image 35
Yichun Avatar answered Jan 31 '23 09:01

Yichun