[SOLVED] Replace rows in a numpy 2d array with rows from another 2d array

Issue

I have two 2d arrays, let’s call them img (m * n) and means (k * n), and a list, let’s call this clusters (m, ). I’d like to replace rows in the img array with rows from the means array where I select the row from the means array based on the value in the clusters list. For example:

Suppose, img

``````img = np.array([[0.40784314, 0.48627451, 0.52549022],
[0.05490196, 0.1254902, 0.2]]) # This will be a (m * n) array
``````

And, means

``````means = np.array([[0.80551694, 0.69010299, 0.17438512],
[0.33569541, 0.45309059, 0.52275014]]) # (k * n) array
``````

And, clusters list

``````clusters = [1, 0] # list of length m
``````

The Desired output is

``````[[0.33569541 0.45309059 0.52275014]
[0.80551694 0.69010299 0.17438512]] # This should be a (m * n) array, same as img above
``````

Notice that the first row has been replaced with the second row from the means array because cluster[0] == 1 and second row has been replaced with the first row from the means array because cluster[1] == 0 and so on so forth.

I am able to do this using the following line of code, but I was wondering if there is any faster way of doing this, if any.

``````np.array([means[i] for i in clusters])
``````

Solution

What you’re looking for is called advanced indexing:

``````>>> means[clusters]
array([[0.33569541, 0.45309059, 0.52275014],
[0.80551694, 0.69010299, 0.17438512]])
``````