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)を紹介します。
ではでは今回はこんな感じで。
コメント