Home > Net >  broadcasting element-wise operation in numpy
broadcasting element-wise operation in numpy

Time:06-18

I have two vectors x and y. x has a size of 900 and y has a size of 12. I want to take each element in x and subtract it from all elements in y and then take the argmin. The resulted vector has a size of 900 and each element's value is between 0 and 11. Here is a for loop which I am trying to avoid:

result = []
for x_e in x:
   result.append(np.argmin(np.abs(y - x_e)))

CodePudding user response:

You can broadcast a column array onto a rows. So you can just add an axis, subtract, and pass this to argmin

import numpy as np

x = np.array([4, 5, 7, 12, 9, 3, 99, 23, 57, 65])
y = np.array([100, 200, -50])

np.argmin(y - x[:, None], axis=1 )
# array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

This is the same result you get with your loop.

CodePudding user response:

Use np.repeat to repeat x 12 times (the size of y). Then you can use the transpose of X (now a matrix or 2d-array) to do the substraction. Here is an example with some sample data:

x = np.array([[2,3,4]])
y = np.array([2, 1])
x = np.repeat(x, y.shape[0], axis=0)
x.T - y

And then you can take the element-wise argmin of the resulting array.

CodePudding user response:

something like that may work:

import numpy as np

X=np.random.rand(900,1)
Y=np.random.random((1,12))*10
X_temp=np.repeat(X, Y.shape[-1],axis=1)

sub_esult=X_temp-Y

final_result=np.argmin(sub_esult, axis=1)

print(final_result)
  • Related