Skip to content

toona note

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