[解決済み] numpy の argpartition 出力を理解できない
質問
numpyからarpgpartitionを使おうとしているのですが、何かうまくいかないようで、なかなか解決できません。以下がその内容です。
これらは、ソートされた配列の最初の5つの要素です。
norms
np.sort(norms)[:5]
array([ 53.64759445, 54.91434479, 60.11617279, 64.09630585, 64.75318909], dtype=float32)
しかし
indices_sorted = np.argpartition(norms, 5)[:5]
norms[indices_sorted]
array([ 60.11617279, 64.09630585, 53.64759445, 54.91434479, 64.75318909], dtype=float32)
ソートされた配列と同じ結果が得られるはずだと思うのですが?
3をパラメータにするとうまくいきます。
indices_sorted = np.argpartition(norms, 3)[:3]
norms[indices_sorted]
array([ 53.64759445, 54.91434479, 60.11617279], dtype=float32)
これは私にはあまり意味をなさないのですが、どなたか洞察を与えていただけませんか?
EDIT: この質問を、argpartitionがk個の分割された要素の順序を維持するかどうか、と言い換えると、より意味があります。
どのように解決するのですか?
k番目のパラメータをスカラーとして与える代わりに、ソートされた順序で保持されるインデックスのリストを使用する必要があります。したがって,最初の
5
要素の代わりに
np.argpartition(a,5)[:5]
は、単に - を行う。
np.argpartition(a,range(5))[:5]
以下は、わかりやすくするためのサンプル実行です。
In [84]: a = np.random.rand(10)
In [85]: a
Out[85]:
array([ 0.85017222, 0.19406266, 0.7879974 , 0.40444978, 0.46057793,
0.51428578, 0.03419694, 0.47708 , 0.73924536, 0.14437159])
In [86]: a[np.argpartition(a,5)[:5]]
Out[86]: array([ 0.19406266, 0.14437159, 0.03419694, 0.40444978, 0.46057793])
In [87]: a[np.argpartition(a,range(5))[:5]]
Out[87]: array([ 0.03419694, 0.14437159, 0.19406266, 0.40444978, 0.46057793])
ご注意ください
argpartition
はパフォーマンス面で理にかなったもので、要素の小さなサブセットに対してソートされたインデックスを取得したい場合、例えば
k
の数は、elems の総数のごく一部です。
もっと大きなデータセットを使って、すべての要素についてソートされたインデックスを取得することで、上記の点を明確にしてみましょう -。
In [51]: a = np.random.rand(10000)*100
In [52]: %timeit np.argpartition(a,range(a.size-1))[:5]
10 loops, best of 3: 105 ms per loop
In [53]: %timeit a.argsort()
1000 loops, best of 3: 893 µs per loop
このように、すべてのエレメントをソートするには
np.argpartition
は向かない。
さて、この大きなデータセットで、最初の5つの要素だけについてソートされたインデックスを取得し、それらの順序も維持したいとしましょう -。
In [68]: a = np.random.rand(10000)*100
In [69]: np.argpartition(a,range(5))[:5]
Out[69]: array([1647, 942, 2167, 1371, 2571])
In [70]: a.argsort()[:5]
Out[70]: array([1647, 942, 2167, 1371, 2571])
In [71]: %timeit np.argpartition(a,range(5))[:5]
10000 loops, best of 3: 112 µs per loop
In [72]: %timeit a.argsort()[:5]
1000 loops, best of 3: 888 µs per loop
とても便利です。
関連
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] NumPyの配列を切り詰めずに、完全に表示するにはどうしたらよいですか?
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] シェルコマンドの実行と出力のキャプチャ
-
[解決済み] NumPyでユークリッド距離はどのように計算できますか?
-
[解決済み] NumPy の配列を csv ファイルにダンプする
-
[解決済み] NumPy多次元配列のi番目の列にアクセスする方法は?
-
[解決済み] 通常のPythonのリストと比較した場合、NumPyの利点は何ですか?
-
[解決済み] Numpy配列の次元
-
[解決済み] 配列内の何かの最初のインデックスを返すNumPy関数はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python カメの描画コマンドとその例
-
Python百行で韓服サークルの画像クロールを実現する
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み] データ型が理解できない
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み】ValueError: xとyは同じサイズでなければならない