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

Mary-Kate Olsen
Release: 2024-10-21 13:09:02
Original
922 people have browsed it

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]
Copy after login

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)]
Copy after login

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)
Copy after login

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)]
Copy after login

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!

source:php
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!