こんにちは、インストラクターのフクロウです。
この記事では、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が適切か
あたりを確認しましょう。
慣れるにはプログラムをたくさん書くのが一番です!ぜひやってみてくださいね!