NumPyのconcatenate(), vstack(), hstack(), dstack(), stack()の違い について毎回混乱するのでまとめました。
複数のアレイを、既存の軸に沿って結合する関数です。
基本的に、後述するvstack(), hstack(), dstack()の上位互換がconcatenate()だと思っておけば良さそう。
2つの同shapeなアレイを結合する例を示します。axis
の指定によりどの軸に沿って結合するかを指定します。
a = np.random.random((5, 6, 7, 8))
b = np.random.random((5, 6, 7, 8))
c = np.concatenate([a, b], axis=0)
c = np.concatenate([a, b], axis=1)
c = np.concatenate([a, b], axis=2)
c = np.concatenate([a, b], axis=3)
c = np.concatenate([a, b])
axis
で指定した軸に関しては長さがずれていても結合できます。
a = np.random.random((5, 6, 7, 8))
b = np.random.random((5, 6, 70, 8))
c = np.concatenate([a, b], axis=2)
vstack(), hstack(), dstack()
基本的に以下のように思っておけばよいです。
- vstack():
concatenate(axis=0)
と同じ
- hstack():
concatenate(axis=1)
と同じ
- dstack():
concatenate(axis=2)
と同じ
hstack()
の例だけ以下に示します。
a = np.random.random((5, 6, 7, 8))
b = np.random.random((5, 6, 7, 8))
c = np.hstack([a, b])
しかし、以下に示すように、細部が微妙に異なります。個人的には、これらを覚えるのはかなり困難なので、
事前に結合対象となるアレイのdimを合わせたあとにconcatenate()(または場合に応じてvstack(), hstack(), dstack())を使うほうが
読みやすいコードになるのではないかと思います。
vstack()に渡された1-Dアレイ(e.g. (N,))は、結合前に2-Dアレイ(e.g. (1, N,))に拡張されます。よって1-Dアレイと2-Dアレイの結合が可能です。
a = np.random.random((7, ))
b = np.random.random((100, 7))
c = np.vstack([a, b])
hstack()に1-Dアレイと1-Dアレイが渡された場合は、例外的に、連結された1-Dアレイが返ります。
a = np.random.random((5,))
b = np.random.random((5,))
c = np.hstack([a, b])
1-Dアレイと2-Dアレイが渡された場合はエラーになります。
dstack()に渡された1-Dアレイ(e.g. (N,))は、結合前に3-Dアレイ(e.g. (1,N,1))に拡張されます。
dstack()に渡された2-Dアレイ(e.g. (M,N))は、結合前に3-Dアレイ(e.g. (M,N,1))に拡張されます。
よって1-Dアレイ、2-Dアレイ、3-Dアレイの結合が可能となることがあります。
a = np.random.random((5,))
b = np.random.random((1,5))
c = np.random.random((1,5,100))
d = np.dstack([a, b, c])
stack()
はこれまで紹介したコードと異なり、新規に軸を生成します。
a = np.random.random((5, 6, 7))
b = np.random.random((5, 6, 7))
c = np.stack([a, b], axis=0)
c = np.stack([a, b], axis=1)
c = np.stack([a, b], axis=2)
c = np.stack([a, b])
参考URL