Home  >  Article  >  Backend Development  >  How to Efficiently Index N-Dimensional Arrays with Lower-Dimensional Index Arrays?

How to Efficiently Index N-Dimensional Arrays with Lower-Dimensional Index Arrays?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-21 13:09:02910browse

How to Efficiently Index N-Dimensional Arrays with Lower-Dimensional Index Arrays?

Indexing an N-Dimensional Array with an (N-1)-Dimensional Array

Accessing an N-dimensional array with an (N-1)-dimensional array presents a challenge when seeking values aligned along a specific dimension. Conventional approaches using np.argmax may not be sufficient.

Advanced Indexing Approach

Elegant indexing can be achieved through advanced indexing using np.ogrid. For a 3D array a and its argmax along the first dimension, idx:

import numpy as np

a = np.random.random_sample((3, 4, 4))
idx = np.argmax(a, axis=0)

m, n = a.shape[1:]
I, J = np.ogrid[:m, :n]
a_max_values = a[idx, I, J]

This approach creates a grid that effectively expands the index array to the full dimensions of the original array.

Generalization for Arbitrary Dimensions

For a more generalized solution, the argmax_to_max() function can be defined:

def argmax_to_max(arr, argmax, axis):
    new_shape = list(arr.shape)
    del new_shape[axis]

    grid = np.ogrid[tuple(map(slice, new_shape))]
    grid.insert(axis, argmax)

    return arr[tuple(grid)]

This function takes the original array, its argmax, and the desired axis and returns the corresponding maximum values.

Alternative Approach for General Indexing

For indexing any N-dimensional array with an (N-1)-dimensional array, the all_idx() function is a more simplified solution:

def all_idx(idx, axis):
    grid = np.ogrid[tuple(map(slice, idx.shape))]
    grid.insert(axis, idx)
    return tuple(grid)

Using this function, indexing into the array a with idx along axis axis can be accomplished with:

axis = 0
a_max_values = a[all_idx(idx, axis=axis)]

The above is the detailed content of How to Efficiently Index N-Dimensional Arrays with Lower-Dimensional Index Arrays?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn