1

I have several arrays of the same shape and want to find a way to not just get the minimum value of each cell, but also the array from which the min value is coming from. I think the best way to do this is by using an n-dimensional array to store each 2-d array so that I can return the index of the min value for each cell. For example, let's say I have 3 arrays:

>>> import numpy as np
>>> a = np.random.random((3,3))
>>> b = np.random.random((3,3))
>>> c= np.random.random((3,3))
>>> arr = (a, b,c)
>>> print(arr[0])
[[0.29242554 0.408617   0.79015308]
 [0.52468204 0.36527803 0.51636725]
 [0.21796501 0.5780124  0.96879438]]
>>> print(arr[1])
[[0.48522564 0.24768296 0.22151351]
 [0.04493776 0.82884756 0.89689985]
 [0.30159678 0.47734114 0.47589837]]
>>> print(arr[2])
[[0.91569256 0.81359633 0.2493089 ]
 [0.97324684 0.09040656 0.20129747]
 [0.89355251 0.08643836 0.44796705]]

From this, I can return an array that has the min value across all 2d arrays:

np.minimum.reduce(arr)
array([[0.29242554, 0.24768296, 0.22151351],
       [0.04493776, 0.09040656, 0.20129747],
       [0.21796501, 0.08643836, 0.44796705]])

But how do I get the indices of these values so I can apply it to another set of arrays that are the same shape and size?:

1
  • 1
    investigate argmin as well as the multiple-argument form of where Commented Mar 1, 2022 at 18:18

1 Answer 1

1

Put a, b and c into a single array, and use the min() and argmin() methods with axis=0.

Here's an example with smaller arrays:

In [218]: a = np.array([[2.0, 3.0], [5.0, 7.0]])

In [219]: b = np.array([[1.5, 9.0], [4.5, 6.0]])

In [220]: c = np.array([[3.0, 6.5], [5.0, 5.0]])

Put them into a single array with shape (3, 2, 2):

In [221]: arr = np.array((a, b, c))

In [222]: arr.shape
Out[222]: (3, 2, 2)

Use the min() and argmin() methods to get the minimum value and its index:

In [223]: arr.min(axis=0)
Out[223]: 
array([[1.5, 3. ],
       [4.5, 5. ]])

In [224]: arr.argmin(axis=0)
Out[224]: 
array([[1, 0],
       [1, 2]])
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks- this is great! Do you know how to apply the index to another (3,2,2) array and return a 2d array? The following works, but I was hoping to slice instead: condition = arr==arr.min(axis=0) and then this: np.where([condition[0]], a, 0) + np.where([condition[1]], b, 0) + np.where([condition[2]], c, 0)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.