numpy の concatenate, vstack, hstack の挙動の比較と使い分け
はじめに
numpy には、vstack, hstack という関数があります。
これらは、concatenate で axis を指定することで、同じことができます。
このノートでは、vstack, hstack と concatenate を比較し、ほぼ同一の関数が実装されている意図を探ります。
結論
concatenate の axis を指定することで vstack も hstack も実行可能。
おそらく分かりやすさのために、ほぼ同一の関数が実装されているだけ。
動作の確認
hstack は concatenate で axis=1, vstack は concatenate で axis=0 とした場合と同一の動作をします。
2 つの 1 次元 ndarray、a = [0, 1, 2] b = [3, 4, 5] を用いて動作を確認します。
最初に hstack について。
このように、 1 次元 ndarray に対して hstack と、axis=0 の concatenate は同一の挙動となります。
次に vstack について。
このように、1 次元 ndarray に対する vstack と 2 次元化した ndarray に対する axis=0 の concatenate は同一の挙動となります。
concatenate との違いの探求
concatenate ではできず、vstack, hstack でできる事があるならば違いが明らかになるのですが、そのような挙動はないようです。
違いがわからないので、numpy のソースを確認しました。
すると、hstack のなかで concatenate を呼んでいることがわかります。
つまり、concatenate, vstack, hstack は同一の動作ではあるが、よりシンプルに記述できるようにした関数が、vstack, hstack であるようです。
例えば、上に示したサンプルコードの vstack と concatenate の比較では、concatenate は、先に 2 次元化する必要があり、記述量が多くなりました。
このようなケースを美しく記述するために用意されているのでしょう。
最初から 2 次元の ndarray に対する挙動では違いは見られません。
速度の確認
hstack, vstack の中で concatenate を呼んでいるならば、微妙に遅くなるのではないかと考えました。
速度を比較してみます。
このコードを複数回実行して確認したところ、私の環境では、常に concatenate の方が速いです。
しかし、その差は 0.001 s 程度であり、通常の使用方法において、実用上問題になる差があるようには思えませんでした。
実行環境
- python: 3.8.11
- numpy: 1.20.3