▶ Numpyの基本を解説しています。過去の記事はこちらからどうぞ。
はじめに
今回はndarrayの結合方法を扱います。ndarrayの結合にはいろんな関数が用意されていますが、最も基本的なnp.concatenate()とnp.stack()について基本から解説していきます。これらをしっかり学んでおけば、他のnp.hstack()やnp.vstack()なども同様に扱うことができます。早速見ていきましょう。
ndarrayの結合
ndarrayの次元を変えずに結合する
まずはndarrayの次元を変えずに結合する場合です。np.concatenate()を使います。書式を確認しておきましょう。
docstringを確認すると、(a1, a2,・・・)の部分は以下のような記述があります。
「a1, a2,・・・」に対しては「sequence of array_like」とあるのでタプルやリストなど配列に相当するものであればよいとわかります。axisは行方向(axis=1)に結合するか、列方向(axis=0)に結合するかを指定することができます。
試してみましょう。まずはサンプルのデータを作ります。
# ndarrayの作成
array_a = np.random.randn(3,3)
array_b = np.random.randn(3,3)
print(array_a)
print(array_b)
これを結合してみましょう。まずはdefaultのaxis=0で試してみます。
# concatenate()で結合:axis=0
np.concatenate([array_a,array_b],axis=0)
このようにaxis=0とすると、行方向に結合されます。どのように列方向の結合も確認しておきましょう。
# concatenate()で結合:axis=1
np.concatenate([array_a,array_b],axis=1)
いずれの場合も次元数に変更はありません。形状と次元数を確認しておきましょう。
print('**形状について**')
print('array_a の形状は:{}'.format(array_a.shape))
print('array_b の形状は:{}'.format(array_b.shape))
print('列方向に結合した時の形状は{}'.format(np.concatenate([array_a,array_b],axis=0).shape))
print('行方向に結合した時の形状は{}'.format(np.concatenate([array_a,array_b],axis=1).shape))
print()
print('**次元について**')
print('array_a の次元は{}'.format(array_a.ndim))
print('array_b の次元は{}'.format(array_b.ndim))
print('列方向に結合した時の次元は{}'.format(np.concatenate([array_a,array_b],axis=0).ndim))
print('行方向に結合した時の次元は{}'.format(np.concatenate([array_a,array_b],axis=1).ndim))
ndarrayに次元を増やして結合する
次に新たな軸を作成して、その軸に沿って配列を連結する方法をご紹介します。これは新たな軸を作成して、元のndarrayを重ね合わせるイメージですね。書式は以下のようになります。
こちらもdocstringを確認しておきましょう。
arraysは先ほどと同様にarray_likeとありますね。そのあとに、どのarrayも形状が同じであること、とりますね。今回のサンプルデータarray_a, array_bはどちらも3×3としているので問題ないですね。試してみましょう。はじめに、もういちどデータの確認をしておきましょう。
print(array_a)
print(array_b)
# np.stack()で結合:axis=0
np.stack([array_a,array_b],axis=0)
# np.stack()で結合:axis=1
np.stack([array_a,array_b],axis=1)
# np.stack()で結合:axis=2
np.stack([array_a,array_b],axis=2)
この辺は慣れるまで何度かサンプルのarrayを自分で試すしかないですね。それぞれの結合後の形状と次元は以下のようになります。
print('**形状について**')
print('array_a の形状は:{}'.format(array_a.shape))
print('array_b の形状は:{}'.format(array_b.shape))
print('axis=0でstackした時の形状は{}'.format(np.stack([array_a,array_b],axis=0).shape))
print('axis=1でstackした時の形状は{}'.format(np.stack([array_a,array_b],axis=1).shape))
print('axis=2でstackした時の形状は{}'.format(np.stack([array_a,array_b],axis=2).shape))
print()
print('**次元について**')
print('array_a の次元は{}'.format(array_a.ndim))
print('array_b の次元は{}'.format(array_b.ndim))
print('axis=0でstackした時の次元は{}'.format(np.stack([array_a,array_b],axis=0).ndim))
print('axis=1でstackした時の次元は{}'.format(np.stack([array_a,array_b],axis=1).ndim))
print('axis=2でstackした時の次元は{}'.format(np.stack([array_a,array_b],axis=2).ndim))
まとめ
今回はndarrayの結合方法を扱いました。np.concatenate()を使った「次元数を変えずに結合する方法」とnp.stack()を使った「次元を増やして結合する方法」に分けて解説しました。np.stack()の方は一部、イメージにしくい部分もあるかもしれません。「重ねる」イメージを持ち、その重ねる方向をaxisで指定できる、と考えるとわかりやすいかもしれませんね。
コメント