【NumPy】配列を連結する方法(np.hstack、 np.vstack、np.dstack、np.stack、np.concatenate、np.block)[Python]

  • URLをコピーしました!
目次

NumPy

前回、SciPyでscipy.fftによる高速フーリエ変換の方法を紹介しました。

今回、NumPyで配列を連結する方法(np.hstack、np.vstack、np.dstack、np.concatenate、np.block)を紹介します。

それでは始めていきましょう。

np.hstack、np.vstack、np.dstack

np.hstack、np.vstack、np.dstackは類似した関数で複数の配列をそれぞれ横方向、縦方向、深さ方向に結合させることができます。

「np.hstack((配列1, 配列2, 配列3…))」では与えられた配列を横に連結します。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.hstack((list1, list2))

print(result)

実行結果
[1 2 3 4 5 6]

2次元配列の場合はそれぞれの配列の一つ目の要素同士、二つ目の要素同士と同じインデックス同士の要素(配列)が連結されます。

import numpy as np

list1 = [[1, 2, 3], 
         [3, 2, 1]]

list2 = [[4, 5, 6], 
         [6, 5, 4]]

result = np.hstack((list1, list2))

print(result)

実行結果
[[1 2 3 4 5 6]
 [3 2 1 6 5 4]]

「np.vstack((配列1, 配列2, 配列3…))」では与えられた配列を縦に連結します。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.vstack((list1, list2))

print(result)

実行結果
[[1 2 3]
 [4 5 6]]

2次元配列の場合はそれぞれの配列が2次元配列のまま連結された状態になります。

import numpy as np

list1 = [[1, 2, 3], 
         [3, 2, 1]]

list2 = [[4, 5, 6], 
         [6, 5, 4]]

result = np.vstack((list1, list2))

print(result)

実行結果
[[1 2 3]
 [3 2 1]
 [4 5 6]
 [6 5 4]]

「np.dstack((配列1, 配列2, 配列3…))」では与えられた配列を深さ方向に連結します。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.dstack((list1, list2))

print(result)

実行結果
[[[1 4]
  [2 5]
  [3 6]]]

深さ方向の場合は分かりにくいですが、各配列の最初の要素同士、二つ目の要素同士、三つ目の要素同士…が3次元目の配列として作成されます。

2次元配列の場合も同様に各配列の最初の要素同士、二つ目の要素同士、三つ目の要素同士…が3次元目の配列として作成されますが、それが1つ目の配列、2つ目の配列とそれぞれの配列同士で作成されます。

import numpy as np

list1 = [[1, 2, 3], 
         [3, 2, 1]]

list2 = [[4, 5, 6], 
         [6, 5, 4]]

result = np.dstack((list1, list2))

print(result)

実行結果
[[[1 4]
  [2 5]
  [3 6]]

 [[3 6]
  [2 5]
  [1 4]]]

np.stack

np.hstack、np.vstack、np.dstackは結合する軸が決まっている関数でした。

それらとは異なり、オプション引数で結合する軸を変えられるのが「np.stack」です。

使い方は「np.stack((配列1, 配列2, 配列3…))」です。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.stack((list1, list2))

print(result)

実行結果
[[1 2 3]
 [4 5 6]]

結合する軸の方向を変えるにはオプション引数「axis」を用います。

デフォルトは「axis=0」で、追加しない場合と同じ結果になります。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.stack((list1, list2), axis=0)

print(result)

実行結果
[[1 2 3]
 [4 5 6]]

「axis=1」では縦方向に連結します。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.stack((list1, list2), axis=1)

print(result)

実行結果
[[1 4]
 [2 5]
 [3 6]]

また「axis=-1」とすると最後の軸方向に連結します。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.stack((list1, list2), axis=-1)

print(result)

実行結果
[[1 4]
 [2 5]
 [3 6]]

np.concatenate

「np.concatenate((配列1, 配列2, 配列3…))」は与えられた配列を横方向に連結します。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.concatenate((list1, list2))

print(result)

実行結果
[1 2 3 4 5 6]

ただし2次元配列の場合は縦に連結します。

import numpy as np

list1 = [[1, 2, 3], 
         [3, 2, 1]]

list2 = [[4, 5, 6], 
         [6, 5, 4]]

result = np.concatenate((list1, list2))

print(result)

実行結果
[[1 2 3]
 [3 2 1]
 [4 5 6]
 [6 5 4]]

np.concatenateでは「axis=軸方向」のオプションを追加することで、結合する方向を指定することができます。

import numpy as np

list1 = [[1, 2, 3], 
         [3, 2, 1]]

list2 = [[4, 5, 6], 
         [6, 5, 4]]

result = np.concatenate((list1, list2), axis=1)

print(result)

実行結果
[[1 2 3 4 5 6]
 [3 2 1 6 5 4]]

np.concatenateに関してはこちらの記事でも紹介していますので、よかったらどうぞ。

np.block

「np.block([配列1, 配列2, 配列3…])」は配列を縦方向に連結します。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.block([list1, list2])

print(result)

実行結果
[[1 2 3]
 [4 5 6]]

ちなみに「np.hstack」、「np.vstack」、「np.dstack」、「np.concatenate」では与える配列を配列、もしくはタプルとして一つの引数となる様に与えていました。

np.blockの場合は配列だけ与えることができ、タプルの場合はエラーとなります。

import numpy as np

list1 = [1, 2, 3]
list2 = [4, 5, 6]

result = np.block((list1, list2))

print(result)

実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[19], line 6
      3 list1 = [1, 2, 3]
      4 list2 = [4, 5, 6]
----> 6 result = np.block((list1, list2))
      8 print(result)

(中略)

TypeError: arrays is a tuple. Only lists can be used to arrange blocks, and np.block does not allow implicit conversion from tuple to ndarray.

次回はNumPyでヒストグラムのビンを任意に作成する方法(np.ditigize)を紹介します。

ではでは今回はこんな感じで。

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

コメント

コメントする

目次