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
Barbara StreisandOriginal
2024-12-07 17:22:13720browse

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]])

The desired output would be:

[0, 3, 4]

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]

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]

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)]

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])

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)])

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!

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