こんにちは、インストラクターのフクロウです。
この記事では、NumPyのndarray(np.array)形式の配列を結合するnp.vstackとnp.hstackを紹介します。
これらを使うことで、縦方向や横方向に配列同士をくっつけることができます。
この記事でわかること
- np.vstackを使って縦方向に配列を結合
- np.hstackを使って横方向に配列を結合
- np.concatcate/np.appendを使ってvstack/hstackと同様の操作をする
使い方はとっても簡単!ササッと読んだら試してみましょう!
配列を結合する関数
配列を結合する機能を持った関数の主なものは以下の4つ
- np.vstack
- np.hstack
- np.concatenate
- np.append
です。この内、np.concatenateとnp.appendについてはそれぞれ別の記事で解説していますよ!
この2つの関数では、axisパラメータ指定することで、vstackやhstackのような操作ができます。
この記事では残りのvstack/hstackについて紹介していきます。
np.vstack/np.hstackの使い方
まずはサンプルとして使う配列を用意しましょう。
import numpy as np
# サンプル配列の用意
a = np.arange(10).reshape(2,5)
b = np.arange(15).reshape(3,5)
c = np.arange(8).reshape(2,4)
d = list(range(5))
# 作成した配列をprintして中身を確認
print("a")
print(a)
print("b")
print(b)
print("c")
print(c)
print("d")
print(d)
[Output]
a [[0 1 2 3 4] [5 6 7 8 9]] b [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] c [[0 1 2 3] [4 5 6 7]] d [0, 1, 2, 3, 4]
これらの配列をnp.vstack/np.hstackで結合していきます。
np.vstackを使って縦方向に配列を結合
vstackは結合したい複数の配列をタプルでまとめて引数に受け取ります。
注意したいのは、各行の要素数が同じものでないと結合できないということです。
e = np.vstack((a,b)) # 配列と配列の結合
f = np.vstack((a,d)) # 配列とリストの結合
g = np.vstack((a,b,d)) # 3つ以上の配列の結合
print("e = np.vstack((a,b))")
print(e)
print("nf = np.vstack((a,d))")
print(f)
print("ng = np.vstack((a,b,d))")
print(g)
[Output]
e = np.vstack((a,b)) [[ 0 1 2 3 4] [ 5 6 7 8 9] [ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] f = np.vstack((a,d)) [[0 1 2 3 4] [5 6 7 8 9] [0 1 2 3 4]] g = np.vstack((a,b,d)) [[ 0 1 2 3 4] [ 5 6 7 8 9] [ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [ 0 1 2 3 4]
行の数は異なっていても結合できます。
また、配列のようなオブジェクト(リストなど)についても同様にvstack(やhstack)で結合が可能です。
「結合対象の配列をタプルでまとめる」という書き方は結構忘れるので、注意しましょう!
np.hstackを使って横方向に配列を結合
hstackも使い方はvstackと同じです。
今度は列数が同じでないとエラーになります。
h = np.hstack((a,c))
print("h = np.hstack((a,c))")
print(h)
[Output]
h = np.hstack((a,c)) [[0 1 2 3 4 0 1 2 3] [5 6 7 8 9 4 5 6 7]]
まとめ
この記事ではnp.vstack/np.hstackについて解説しました。
特に難しいところはない関数ですが、名前を忘れることが多そうですね。
もしもこの関数を使う際にエラーが起きたら
- vstack/hstackを取り違えていないか
- タプルで対象配列をまとめているか
- 配列のshapeが適切か
あたりを確認しましょう。
慣れるにはプログラムをたくさん書くのが一番です!ぜひやってみてくださいね!






