numpyで配列を結合する方法7選|mumpy.concatenate()がおすすめ

numpyで配列を結合する方法7選

pythonで配列を簡単に扱うことができるnumpyライブラリ。

numpyで配列を結合する方法はいくつもあり、どれを使っていいか迷ってしまいますよね。

本記事ではnumpyで配列を結合する方法を4つ取り上げ、それぞれどのような特徴があるのか詳しく紹介します。基本的にはnumpy.concatenate()がおすすめです!

本記事のコードは全てグーグルコラボラトリーで記述・動作を確認しています。

グーグルコラボラトリーとはgoogleアカウントを持っている人であれば、誰でも・無料で使うことができるpythonの対話型実行環境です。

データ分析に必要なライブラリが初めから搭載されていて、環境構築の必要がないため、python初心者には特にオススメです!

目次

numpyで配列を結合する7つの方法

numpyで配列を結合する7つの方法

numpyで配列を結合する方法はいくつかありますが、今回はその中から7つの方法を紹介します。

numpy.concatenate()は汎用性があるためオススメです。

numpyを使用するには事前にnumpyをインストールする必要があります。

グーグルコラボラトリーを利用している人はすでにインストールされているので不要です。

自分で環境を用意している人は環境構築を行なってください。

コーディングできる準備ができたら、はじめにnumpyをインポートして使用できるようにしましょう。

numpyはnpと省略してインポートするのが一般的です。

import numpy as np

既存の軸(次元)に沿って結合する|numpy.concatenate()

既存の軸(次元)に沿って結合する|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()

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.vstackは配列を垂直方向に結合できます。

numpy.stackと異なり、次元をそのままで配列を結合することが可能です。

np.vstack((a,c))

出力:

array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])

配列を水平方向 (列方向) に結合|numpy.hstack()

配列を水平方向 (列方向) に結合|numpy.hstack()

numpy.hstackは配列を水平方向に結合する関数です。

numpy.vstack同様、次元をそのままで配列を結合できます。

np.hstack((a,c))

出力:

array([[1, 2, 5, 6],
[3, 4, 7, 8]])

配列を深さ順に結合|numpy.dstack()

配列を深さ順に結合|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()

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()

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.block()は軸が揃っていないとNG

まとめ

今回は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を勉強できる動画がたくさんあるのでおすすめです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次