NumPyでn番目に大きい値を取得する基本的なコードをご紹介しました。
大量のデータから探す場合、時間計算量も考慮する必要があるでしょう。
numpyで2番目に大きい値を取得するサンプル
以下のようなコードで、2番目に大きい数値を、より速く取得できます。
nums = np.array([
[99, 66, 33],
[88, 55, 22],
[77, 44, 11],
])
np.partition(nums.ravel(), -2)[-2]
このようなコードであれば、最悪時間計算量でもO(n)のオーダーで済みます。
サンプルで行っている処理について
ポイントは、numpyのpartition関数です。
np.partition(nums.ravel(), -2)[-2]
partition関数は、第2引数で指定されたインデックス位置よりも前にそれよりも小さいデータのみを、後ろに大きいデータのみを配置してくれます。
例えば、
nums = np.array([10000, 1000, 100, 10, 1])
だった場合に、
np.partition(nums, 3)
は、
array([ 10, 1, 100, 1000, 10000])
を返します。
第2引数に指定されたインデックス「3」に該当する「1000」の前には、より小さい「10」「1」「100」が、後ろには「10000」が配置されています。
このnumpy.partition関数の引数に「-2」を指定して、
np.partition(nums.ravel(), -2)[-2]
そのndarrayの「-2」の位置にあるデータを取得することで、
np.partition(nums.ravel(), -2)[-2]
2番目に大きいデータを取得しています。
最終更新日時:2020-11-07 13:02
Home » Python » NumPyの使い方 » NumPyでn番目に大きい値をより速く取得する-partition関数