[SOLVED] How to pick one of two arrays in an axis of multidimensional NumPy array with an 1D index array for that axis

Issue

I have an array with shape (n, 2, 3) as:

array = np.array([[[-0.903, -3.47, -0.946], [-0.883, -3.48, -0.947]],
                  [[-1.02, -3.45,  -0.992], [-1.01,  -3.46,     -1]],
                  [[-1.02, -3.45,  -0.992], [-0.998, -3.45,     -1]],
                  [[-0.638, -3.5,  -0.897], [-0.604, -3.51, -0.896]],
                  [[-0.596, -3.52, -0.896], [-0.604, -3.51, -0.896]]])

and an index array for the second axis in which each value refer to each of two combinations e.g. for [-0.903, -3.47, -0.946], [-0.883, -3.48, -0.947] if the corresponding value in index array be 1, [-0.883, -3.48, -0.947] must be taken:

indices = np.array([0, 1, 0, 0, 1], dtype=np.int64)

the resulted array must be as below with shape (n, 3):

[-0.903, -3.47, -0.946] [-1.01, -3.46, -1] [-1.02, -3.45, -0.992] [-0.638, -3.5, -0.897] [-0.604, -3.51, -0.896]

How could I do so on a specified dimension just by NumPy.

Solution

In numpy you can combine slices along two dimensions. If you do arr[idx_x, idx_y] where idx_x and idx_y are 1d arrays of the same length you will get array of elements: [arr[idx_x[0], idx_y[0]], arr[idx_x[1], idx_y[1]], arr[idx_x[2], idx_y[2]], ...]

In your example if you do:

indices = np.array([0, 1, 0, 0, 1], dtype=np.int64)
x_idxs = np.arange(len(indices), dtype=int)
print(array[x_idxs, indices])

This will return result you want.

Answered By – balbok

Answer Checked By – Marilyn (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *