ホームページ > バックエンド開発 > Python チュートリアル > NumPy 配列内の特定の値の行インデックスを効率的に見つけるにはどうすればよいですか?

NumPy 配列内の特定の値の行インデックスを効率的に見つけるにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-07 17:22:13
オリジナル
717 人が閲覧しました

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

を利用する方法です np.where とブロードキャスト機能は次のとおりです。

np.where((X == searched_values[:, None]).all(-1))[1]
ログイン後にコピー

Approach 2: Memory-Efficient Linear Index Conversion

NumPy の np.ravel_multi_index を使用して、各行を固有の線形インデックスに変換する方法があります。

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 の np.searchsorted を使用して、線形インデックスを高速に見つけることもできます。

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)]
ログイン後にコピー

np.ravel_multi_index の動作:

np.ravel_multi_index は、多次元インデックスの線形インデックス表現を作成します。各行を n 次元多次元配列のインデックスとして解釈し、対応する線形インデックスを生成します。

例えば、サンプルの配列 X に対して np.ravel_multi_index(X.T, dims) を適用すると、次のようになります。

np.ravel_multi_index(X.T, dims)
# Output: array([30, 66, 61, 24, 41])
ログイン後にコピー

これは、配列 X の各行が持つ線形インデックスを表しています。この線形インデックスは、配列内の各行を一意に識別するために使用できます。

それぞれの方法に対応したサンプルコードは以下になります。

# 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)])
ログイン後にコピー

いずれかのアプローチを使用して、配列 X 内の特定の値の行インデックスを簡単に特定できます。

以上がNumPy 配列内の特定の値の行インデックスを効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート