[NumPy] 配列の連結・分割

[NumPy] 配列の連結・分割

配列の連結

numpy.concatenate() 配列の連結

 numpy.concatenate()を使うと、複数の配列を連結することができます。

 numpy.concatenate((a1, a2, ...), axis=0, out=None)

 a1, a2, a3, ... には配列を渡します。
 2 次元以上の配列を渡す場合は axis を指定できます (デフォルトは axis = 0)。

# 配列の連結

# NumPyをインポート
import numpy as np

a1 = np.array([[1, 2, 3],
               [4, 5, 6]])

a2 = np.array([[7, 8, 9]])

a3 = np.array([[1, 1],
               [2, 2]])

# 1次元配列同士を第1軸(縦軸)方向に連結
x = np.concatenate((a1, a2))

# 1次元配列同士を第1軸(縦軸)方向に連結
y = np.concatenate((a1, a3), axis = 1)

print("配列x\n{}\n\n".format(x))
print("配列y\n{}".format(y))
配列x
[[1 2 3]
 [4 5 6]
 [7 8 9]]
 
配列y
[[1 2 3 1 1]
 [4 5 6 2 2]]

 

numpy.vstack() 縦軸方向に連結

 numpy.vstack()は、受け取った配列を縦積みします。引数には配列のシーケンス(リストやタプル)を渡します。この関数は numpy.concatenate() で axis に 0 を渡した場合と同じ機能をもちます。

# np.vstack()による配列の連結

# NumPyをインポート
import numpy as np

a1 = np.array([[1, 1, 1]])
a2 = np.array([[2, 2, 2]])

# 1次元配列同士を第1軸(縦軸)方向に連結
x = np.vstack((a1, a2))

print(x)
[[1 1 1]
 [2 2 2]]

 

numpy.hstack() 横軸方向に連結

 numpy.hstack()は、受け取った配列を横軸方向に連結します。引数には配列のシーケンス(リストやタプル)を渡します。この関数は numpy.concatenate() で axis に 1 を渡したときと同じ機能をもちます。

# np.hstack()による配列の連結

# NumPyをインポート
import numpy as np

a1 = np.array([[1, 1]])
a2 = np.array([[2, 2]])

# 1次元配列同士を第2軸(横軸)方向に連結
x = np.hstack((a1, a2))

print(x)
[[1 1 2 2]]

 

配列の分割

numpy.split() 均等に分割

 numpy.split() は受け取った配列を分割します。

 numpy.split(array, indices_or_sections, axis=0)

 array には配列オブジェクトを渡します。第 2 引数に整数 N を渡すと、指定した axis (デフォルトは 0) に沿って配列を N 等分します。

# NumPyをインポート
import numpy as np

# 9個の要素をもつ1次元配列を定義
x = np.ones(9, dtype = "int32")

# xを3つの配列に分割
y1, y2, y3 = np.split(x, 3)

print(y1, y2, y3)
[1 1 1] [1 1 1] [1 1 1]

 第 2 引数に分割点インデックスのリストを渡すこともできます。

# NumPyをインポート
import numpy as np

# x = [1 2 3 4 5 6 7 8 9]
x = np.arange(1, 10)

# xをインデックス3,5の位置で分割
y1, y2, y3 = np.split(x, [3, 5])

print(y1, y2, y3)
[1 2 3] [4 5] [6 7 8 9]

 

numpy.array_split() なるべく均等に分割

 numpy.array_split() は受け取った配列を分割します。

 numpy.array_split(array, indices_or_sections, axis=0)

array には配列オブジェクトを渡します。第 2 引数に整数 N を渡すと、指定した axis (デフォルトは 0) に沿って配列を N 等分します。
 numpy.split(x, N) は配列 x が N で割り切れないとエラーを返しますが、numpy.array_split(x, N) は、x が N で割り切れないときには、余りの要素数を先頭の配列から順に割り振ります。たとえば、11 個の要素で構成される配列を 3 分割する場合、4 個、4 個、3 個の要素数をもつ配列に分割します。

import numpy as np

# x = [0 1 2 3 4 5 6 7 8 9 10]
x = np.arange(11)

# 配列xを3等分
y = np.array_split(x, 3)

print(y)
[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8,  9, 10])]

 
 第 2 引数に分割点インデックスのリストを渡すこともできます。
 その場合は numpy.split() と同じはたらきをします。
 

numpy.vsplit() 縦軸方向に分割

 numpy.vsplit() は配列を縦軸方向に分割します。

# NumPyをインポート
import numpy as np

# 乱数を固定
np.random.seed(0)

# 1~9の乱数を要素にもつ4×3配列
x = np.random.randint(1, 10, (4, 3))

print("配列x\n{}\n".format(x))

# 縦軸(第2軸)に沿って配列を2分割
y1, y2 = np.vsplit(x, 2)

print("配列y1\n{}\n".format(y1))
print("配列y2\n{}".format(y2))
配列x
[[6 1 4]
 [4 8 4]
 [6 3 5]
 [8 7 9]
 
配列y1
[[6 1 4]
 [4 8 4]]
 
配列y2
[[6 3 5]
 [8 7 9]]

 

numpy.hsplit() 横軸方向に分割

 numpy.hsplit() は配列を横軸方向に分割します。

# NumPyをインポート
import numpy as np

# 2×2の2次元配列
x = np.array([[1, 2],
              [3, 4]])

# xを2個の配列に水平分割
y1, y2 = np.hsplit(x, 2)

print(y1, "\n")
print(y2)
[[1]
 [3]]
 
[[2]
 [4]