Home > Backend Development > Python Tutorial > How to Efficiently Find Row Indices of Specific Values in a NumPy Array?

How to Efficiently Find Row Indices of Specific Values in a NumPy Array?

Barbara Streisand
Release: 2024-12-07 17:22:13
Original
715 people have browsed it

How to Efficiently Find Row Indices of Specific Values in a NumPy Array?

Finding the Index of Specific Values ​​in a NumPy Array

Problem:

Given an array X, determine the row indices of specified values ​​stored in searched_values. For instance, in the following example, we seek the indices for the values ​​[4, 2], [3, 3], and [5, 6] within the array X.

X = np.array([[4,  2],
              [9,  3],
              [8,  5],
              [3,  3],
              [5,  6]])

searched_values = np.array([[4, 2],
                            [3, 3],
                            [5, 6]])
Copy after login

The desired output would be:

[0, 3, 4]
Copy after login

Solutions:

Approach 1: NumPy Broadcasting

is a way to utilize np.where and the broadcasting functions are as follows.

np.where((X == searched_values[:, None]).all(-1))[1]
Copy after login

Approach 2: Memory-Efficient Linear Index Conversion

How to convert each row to a unique linear index using NumPy's np.ravel_multi_index There is.

dims = X.max(0) + 1
out = np.where(np.in1d(np.ravel_multi_index(X.T, dims),
                       np.ravel_multi_index(searched_values.T, dims)))[0]
Copy after login

Approach 3: Memory-Efficient and Optimized Linear Index Conversion

NumPy's np.searchsorted can also be used to quickly find linear indexes. can.

dims = X.max(0) + 1
X1D = np.ravel_multi_index(X.T, dims)
searched_valuesID = np.ravel_multi_index(searched_values.T, dims)
sidx = X1D.argsort()
out = sidx[np.searchsorted(X1D, searched_valuesID, sorter=sidx)]
Copy after login

How np.ravel_multi_index works:

np.ravel_multi_index creates a linear index representation of a multidimensional index. Interpret each row as an index into an n-dimensional multidimensional array and generate the corresponding linear index.

For example, applying np.ravel_multi_index(X.T, dims) to a sample array X:

np.ravel_multi_index(X.T, dims)
# Output: array([30, 66, 61, 24, 41])
Copy after login

This represents the linear index that each row of array X has. This linear index can be used to uniquely identify each row in the array.

The sample code corresponding to each method is below.

# Approach 1
print(np.where((X == searched_values[:, None]).all(-1))[1])

# Approach 2
dims = X.max(0) + 1
print(np.where(np.in1d(np.ravel_multi_index(X.T, dims),
                       np.ravel_multi_index(searched_values.T, dims)))[0])

# Approach 3
dims = X.max(0) + 1
X1D = np.ravel_multi_index(X.T, dims)
searched_valuesID = np.ravel_multi_index(searched_values.T, dims)
sidx = X1D.argsort()
print(sidx[np.searchsorted(X1D, searched_valuesID, sorter=sidx)])
Copy after login

You can easily determine the row index of a particular value in array X using either approach.

The above is the detailed content of How to Efficiently Find Row Indices of Specific Values in a NumPy Array?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
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