pythonで配列を簡単に扱うことができるnumpyライブラリ。
numpyで配列を結合する方法はいくつもあり、どれを使っていいか迷ってしまいますよね。
本記事ではnumpyで配列を結合する方法を4つ取り上げ、それぞれどのような特徴があるのか詳しく紹介します。基本的にはnumpy.concatenate()がおすすめです!
本記事のコードは全てグーグルコラボラトリーで記述・動作を確認しています。
グーグルコラボラトリーとはgoogleアカウントを持っている人であれば、誰でも・無料で使うことができるpythonの対話型実行環境です。
データ分析に必要なライブラリが初めから搭載されていて、環境構築の必要がないため、python初心者には特にオススメです!
numpyで配列を結合する7つの方法
numpyで配列を結合する方法はいくつかありますが、今回はその中から7つの方法を紹介します。
- 既存の軸(次元)に沿って結合する|numpy.concatenate()
- 新たな軸に沿って結合|numpy.stack()
- 配列を垂直方向 (行方向) に結合|numpy.vstack()
- 配列を水平方向 (列方向) に結合|numpy.hstack()
- 配列を深さ順に結合|numpy.dstack()
- 配列をブロックとして結合|numpy.block()
- 1 次元配列を列として 2 次元配列に結合|column_stack()
numpy.concatenate()は汎用性があるためオススメです。
numpyを使用するには事前にnumpyをインストールする必要があります。
グーグルコラボラトリーを利用している人はすでにインストールされているので不要です。
自分で環境を用意している人は環境構築を行なってください。
コーディングできる準備ができたら、はじめにnumpyをインポートして使用できるようにしましょう。
numpyはnpと省略してインポートするのが一般的です。
import numpy as np
既存の軸(次元)に沿って結合する|numpy.concatenate()
numpy.concatenate()は既存の軸に沿って配列を結合します。
2行2列の配列aと1行2列の配列bを用意して、これらをnumpy.concatenate()で結合してみます。
a = np.array([[1, 2],
[3, 4]])
a
出力:
array([[1, 2],
[3, 4]])
b = np.array([[5, 6]])
b
出力:
array([[5, 6]])
np.concatenate((a, b))
出力:
array([[1, 2],
[3, 4],
[5, 6]])
2つの配列が結合して、3行2列の配列になりました。
引数axisで結合する軸を指定する
nupmpy.concatenate()は、引数axisで結合する軸を指定が可能です。
axisを試したいですが結合は同じ形状の配列のみ可能なため、配列aとbではエラーになってしまいます。
新しい配列を用意してもいいですが、配列bを転置(行と列の入れ替え)すると配列の形状が同じになるので、今回はこれを利用しましょう。
b.T
出力:
array([[5],
[6]])
np.concatenate((a, b.T), axis=1)
出力:
array([[1, 2, 5],
[3, 4, 6]])
今度は2行3列の配列になりました。
ちなみにaxis=Noneを指定した場合、配列はフラット化されます。
np.concatenate((a, b), axis=None)
出力:
array([1, 2, 3, 4, 5, 6])
新たな軸に沿って結合|numpy.stack()
numpy.stack()は新たな軸に沿って配列を結合します。
1次元の配列を結合すると2次元配列に、2次元配列を結合すると3次元配列に、といったように次元が増えるイメージです。
2次元配列aとcをnumpy.stack()で結合してみましょう。
c = np.array([[5, 6,],
[7, 8]])
c
出力:
array([[5, 6], [7, 8]])
np.stack((a,c))
出力:
array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
引数axisで積み上げる配列の軸を指定する
引数axisは積み上げる配列の軸を指定できます。デフォルトは0です。
np.stack((a,c),axis=1)
出力:
array([[[1, 2], [5, 6]], [[3, 4], [7, 8]]])
デフォルト(axis=0)では縦に結合していましたが、axis=1では横に結合した形になりました。
配列を垂直方向 (行方向) に結合|numpy.vstack()
numpy.vstackは配列を垂直方向に結合できます。
numpy.stackと異なり、次元をそのままで配列を結合することが可能です。
np.vstack((a,c))
出力:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
配列を水平方向 (列方向) に結合|numpy.hstack()
numpy.hstackは配列を水平方向に結合する関数です。
numpy.vstack同様、次元をそのままで配列を結合できます。
np.hstack((a,c))
出力:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
配列を深さ順に結合|numpy.dstack()
numpy.dstack()は深さ順に結合できる関数です。
こちらも次元を増やすことなく結合する点がnumpy.stack()と異なります。
np.dstack((a,c))
出力:
array([[[1, 5],
[2, 6]],
[[3, 7],
[4, 8]]])
結合結果はnumpy.dstack()とnumpy.stack()とで異なります。
numpy.dstack()は(M,N)の配列を(M,N,1)の3次元配列に拡張してから結合するため(M,N,O)の順序になります。対してnumpy.stack()は新たな軸がaxis=0で用意されて結合するため(O,M,N)となるのです。
s = np.array([[1],
[2],
[3]])
t = np.array([[4],
[5],
[6]])
u = np.stack((s,t))
v = np.dstack((s,t))
print('sとtは', s.shape, 'の配列')
print(u)
print('stackで結合すると', u.shape, 'の配列になる')
print(v)
print('dstackで結合すると', v.shape, 'の配列になる')
出力:
sとtは (3, 1) の配列
[[[1]
[2]
[3]]
[[4]
[5]
[6]]]
stackで結合すると (2, 3, 1) の配列になる
[[[1 4]]
[[2 5]]
[[3 6]]]
dstackで結合すると (3, 1, 2) の配列になる
1次元配列を列として2次元配列に結合|column_stack()
numpy.column_stack()は縦軸と横軸を入れ替えて結合したい際に便利な関数です。
(N,)の1次元配列を(N, 1)の2次元配列に変換して、それをnumpy.hstackで結合する流れをとっています。
f = np.array([1, 2, 3])
np.column_stack((d, f))
出力:
array([[4, 1], [5, 2], [6, 3]])
配列をブロックとして結合|numpy.block()
numpy.block()は配列の形状を維持したまま結合する関数です。
ブロックを組むイメージで結合します。
d = np.array([4, 5, 6])
d
出力:
array([4, 5, 6])
e = np.array([7])
e
出力:
array([7])
np.block([[a, c],
[d, e]])
出力:
array([[1, 2, 5, 6], [3, 4, 7, 8], [4, 5, 6, 7]])
結合は最後の軸に沿って最初に行うため、軸が揃っていないと結合できません。
2次元配列の場合、行が異なる配列はnumpy.block()で結合しようとするとエラーになります。
g = np.array([5, 6])
g
出力:
array([5, 6])
np.block([[a, g], [g, a]])
出力:
ValueError
まとめ
今回はnumpyで配列を結合する方法を紹介しました。numpy.concatenate()は汎用性が高いためおすすめです。
numpy.hstack(), numpy.vstack(), numpy.dstack()とnumpy.stack()は一見似ているようですが、numpy.stack()を使用すると次元が増える点で違うので注意しましょう。
よくある質問
- 配列に値を追加する方法はありますか?
-
あります。numpy.append()は配列の最後に要素を追加する関数です。
合わせて読みたい - リストをそのまま結合できますか?
-
リストを結合することも可能です。しかし、場合によってはエラーが起きる可能性があります。そのためnumpy.array(リスト)でarray型に変換しましょう。
- 表の結合をしたいです
-
表(DataFlame)の結合をしたい場合、pandas.cancat()を使ってください。
合わせて読みたい - pythonについてもっと勉強したいです!
-
pythonを勉強するには書籍・動画・プログラミングスクールなどがあります。特にUdemyは有料ですが、pythonを勉強できる動画がたくさんあるのでおすすめです。
合わせて読みたい
コメント