heapsortについてquicksortmergesortheapsort引数orderについて詳細な使用例np.sortとnp.ndarray.sortparams:昇順や降順に並べ替えするソート関数としてよく使われるnp.sortとnp.argsortを紹介します。ソートはあらゆる場面で使用する基本アルゴリズムなので、この記事を通して使い方を確認しておきましょう。np.sortsort関数は配列の要素を昇順にソートしたものを返しますが、一方でargsort関数はその入れ替えられた配列のインデックスを返します。APIドキュメントを確認してみます。ソートしたい配列を指定します。(省略可能)初期値-1ソートを行う軸方向を指定します。デフォルトはで最も次元の低いところに沿ってソートします。(省略可能)初期値’quicksort’データの並べ替え方のアルゴリズムを指定します。(省略可能)初期値Noneaがフィールドの定義されている配列であったとき、どのフィールドで要素をソートするかを指定します。returns:要素がソートされた配列が返されます。引数として指定できるのは4つあります。引数はソートしたい配列を指定します。第二引数であるaxisは、どの軸方向に要素をソートをするかを指定します。デフォルトは最も次元の低いaxis=-1になります。第三、第四引数となっているkindとorderは見慣れないものだと思います。kindはソートする際に用いるアルゴリズムを指定し、orderはどのフィールドを元にソートするかを指定します。ソートの種類については、後述します。np.sortは、以下のように使用します。99])np.argsortnp.argsortは、ソート結果の配列のインデックスを返します。APIドキュメントは以下の通りです。ソートしたい配列を指定します。(省略可能)初期値-1ソートを行う軸方向を指定します。デフォルトはで最も次元の低いところに沿ってソートします。(省略可能)初期値’quicksort’データの並べ替え方のアルゴリズムを指定します。(省略可能)初期値Noneaがフィールドの定義されている配列であったとき、どのフィールドで要素をソートするかを指定します。returns:ソートされた軸方向内における、配列の要素の元の配列におけるインデックスを要素とする配列が返されます。このように2つのAPIドキュメントを見比べてみると、最後の出力のされ方が異なるだけで引数などは全て一緒となっています。そのため、まずは2つの関数での共通の性質で、ポイントだと考えられる部分を解説していきたいと思います。np.argsortは、以下のように使います。1])np.argsortを使用すると、ソート後のインデックスが出力されます。heapsortについてnp.sort、np.argsortで指定することのできるアルゴリズムはquicksort、mergesort、heapsortの3種類あります。quicksortquicksortは、あるしきい値を元に要素を前後で交換、分割を繰り返しながらソートしていく方法です。非常に実用的で、ソートする平均処理時間も一番短いとされています。下のアニメーションはquicksortが行われている様子です。スタートボタンを押すと、アルゴリズムの動作の様子が分かります。スタートmergesortmergesortは、配列を分割してからまた再び分割したものを結合していくという手法によってソートするアルゴリズムです。このアルゴリズムは、配列の並べられ方が一様でなくとも安定した処理時間でソートすることが可能です。スタートheapsortheapsortは、配列の要素を一旦ヒープ木に格納してから、最大の要素(もしくは最小)の要素を順に抜き出していく手法です。スタートそれぞれ具体的にどのようなことが起こっているのかは、以下のサイトを参考にしてください。クイックソートマージソートヒープソートどのアルゴリズムを使うべきかについては、基本的にはquicksortで良いと思います。ソート済み配列に適用する場合など、最悪計算量が遅くなる場合があるので、そういった場合にはmergesortやheapsortを検討しましょう。手元のMacbookで実際に計算時間を比較してみます。それぞれのアルゴリズムで長さnの配列をソートする時間を1000回分記録し、その平均と最大を返します。np.max(result3)))以上のようなコードをtest.pyに保存して、実行すると、以下のようになります。0.024383068084716797今回整列をするために用意したのがランダム配列だったので、安定的にquicksortが高速な結果になりました。引数orderについて例えば、以下のような配列を作ります。人名と個人番号(ID)、テストでの点数をまとめたものです。dtype=dtype)この配列で点数について昇順にしたい場合は、orderの出番です。どのフィールドでソートしたいかをorderで指定します。argsortでもできる。0])同じ点数の人が二人以上出たら、その中でどうソートするかも指定できます。今回は、IDを元に並べ替えて見ましょう。0])詳細な使用例もう少し細かくパラメータを指定してみましょう。axisで、ソートする軸方向を指定してみます。bを二次元配列にした。axisを指定しないと列方向の中でソートをする。argsortも同様。表示されるインデックスが列番号だけになっている。次はaxisを指定する。三次元配列でaxis=0方向にソート。ならべかえる要素が2つずつなのでインデックスは0か1。1]]])np.sortとnp.ndarray.sortnp.sortと似たような関数としてnp.ndarray.sortというものがあります。これは、配列のコピーをソートするのではなく、配列自身をソートする関数となっています。APIドキュメントは以下の通りです。(省略可能)初期値-1ソートを行う軸方向を指定します。デフォルトはで最も次元の低いところに沿ってソートします。(省略可能)初期値’quicksort’データの並べ替え方のアルゴリズムを指定します。(省略可能)初期値Noneaがフィールドの定義されている配列であったとき、どのフィールドで要素をソートするかを指定します。配列そのものをソートするだけなので、特に何も値を返すことはありません。使い方自体はnp.sortと全く同じです。実際のコードを見ていきましょう。ソートされた配列が返される。ndarray.sortを使うと、aの中身がソートされる。配列同士を連結する、NumPyのvstackとhstack関数の使い方DeepAgeではAIに関する厳選した内容を記事にしてお届けします。