私はとのminまたはmax値を得ることができることを知っている(好ましくは平坦化ではありません)。これらの値のインデックスは、次の式で返されます。numpy配列から最大または最小のn要素を取得しますか? numpyの行列/ベクトルのうち、</p> <pre><code>max(matrix) min(matrix) </code></pre> <p>:
argmax(matrix)
argmin(matrix)
私は5x5の行列がある場合:
a = np.arange(5*5).reshape(5, 5) + 10
# array([[10, 11, 12, 13, 14],
# [15, 16, 17, 18, 19],
# [20, 21, 22, 23, 24],
# [25, 26, 27, 28, 29],
# [30, 31, 32, 33, 34]])
を私は経由して最大値を得ることができます:
In [86]: np.max(a) # getting the max-value out of a
Out[86]: 34
In [87]: np.argmax(a) # index of max-value 34 is 24 if array a were flattened
Out[87]: 24
...しかし、最大または最小のn要素を取得するための最も効率的な方法は何ですか?
のうちの5つの要素が必要です。これは、それぞれインデックスのために[20, 21, 22, 23, 24]
の5つの最高値のために[30, 31, 32, 33, 34]
を返さなければなりません。同様に、5つの最低値の場合は[10, 11, 12, 13, 14]
、最も低い5つの要素の場合は[0, 1, 2, 3, 4]
となります。
これに対して、効率的で妥当な解決策は何でしょうか?
私の最初のアイデアだった平坦化と配列をソートし、最後と最初の5つの値を取ります。その後、元の2Dマトリックスを検索して、それらの値のインデックスを求めます。 この手順はフラット化+ソートの効率はあまり高くありませんが...もっと速いソリューションを知っている人はいますか?
また、元の2D配列のインデックスを取得したいと思います。だから、np.argmax(a)
によって返された24
の代わりに(4, 4)
を持っています。
'np.partition'(インデックスの場合は' np.argpartition')はO(n)です - これはあなたがここで期待できる最高のものだと思います。最初に配列をラベリングする必要があります(これはビューを作成するだけで、パフォーマンス上のペナルティは発生しません)。 'unravel_index'を使って元の配列の2Dインデックスを取得できます。 –