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 サイトの他の関連記事を参照してください。