Pynote

Python、機械学習、画像処理について

numpy - 配列の結合、分割、要素の追加、削除

複数の配列を結合する。

名前 説明
numpy.r_ 配列を指定した方式で結合する。
numpy.c_ 配列を axis=-1 方向に結合する。
numpy.vstack 配列を axis=0 方向に結合する。
numpy.hstack 配列を axis=1 方向に結合する。
numpy.dstack 配列を axis=2 方向に結合する。
numpy.stack 配列に軸を追加し、その軸で結合する。
numpy.column_stack 配列を axis=1 方向に結合する。
numpy.concatenate 配列を指定した axis 方向に結合する。
numpy.block 配列をブロック状に結合する。

numpy.r_

カンマ区切りで指定した配列を指定した方式で結合する。

関数

numpy.r_[array1, array2, ..., arrayn]
配列をカンマ区切りで指定する。

配列をカンマ区切りで指定した場合、axis=0 方向に結合する。


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

# axis=0 方向で結合する。
c = np.r_[a, b]
print(c)

a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [8, 9]])

# axis=0 方向で結合する。
c = np.r_[a, b]
print(c)
# [[1 2]
#  [3 4]
#  [5 6]
#  [8 9]]
start:stop:step を使用する。

numpy.r_[array1, array2, ..., arrayn] に指定する array は、配列の代わりに start:stop:step 記法を使用できる。

start:stop:step とした場合、np.arange(start, stop, step) が生成する配列となる。
start:stop:stepj と step を複素数とした場合、np.linspace(start, stop, step, endpoint=True) が生成する配列となる。

a = np.array([1, 2, 3])

b = np.r_[a, 0:10:2, 0:2:5j]
print(b)
# [1.  2.  3.  0.  2.  4.  6.  8.  0.  0.5 1.  1.5 2. ]

# 以下と同じ
b = np.r_[a, np.arange(0, 10, 2), np.linspace(0, 2, 5)]
print(b)
# [1.  2.  3.  0.  2.  4.  6.  8.  0.  0.5 1.  1.5 2. ]
結合方法を指定する。

numpy.r_['a,b,c', array1, array2, ..., arrayn] と最初に文字列 'a,b,c' を指定することで結合方法を指定できる。

  • 'a': 結合する方向を指定する。
  • 'b': 次元数が b 未満の場合、結合前にサイズ1の次元を挿入して、次元数を b にする。(デフォルトは0)
  • 'c': 次元数が b 未満の場合、元の配列 axis=0 が axis=c の位置にくるようサイズ1の次元を挿入する。(デフォルトは0、つまり axis=-1 に次元を挿入する。)

'a, b, c' は 'a' や 'a,b' のように省略可能である。その場合、省略したものはデフォルトの値が使われる。

例: a だけ指定する。


a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [8, 9]])

# axis=0 方向で結合する。
c = np.r_['0', a, b]
print(c)
# [[1 2]
#  [3 4]
#  [5 6]
#  [8 9]]


a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [8, 9]])

# axis=1 方向で結合する。
c = np.r_['1', a, b]
print(c)
# [[1 2 5 6]
#  [3 4 8 9]]

# axis=-1 (a.k.a axis=1) 方向で結合する。
c = np.r_['-1', a, b]
print(c)
# [[1 2 5 6]
#  [3 4 8 9]]

例: a,b だけ指定する。

a = np.array([1, 2])
b = np.array([[5, 6],
              [8, 9]])

# a は2次元未満なので、サイズ1の次元を挿入して2次元にする。
# c は指定されていないので、デフォルト0であり、元の配列の axis=0 の軸の位置が次元を
# 挿入後に axis=0 となるようにサイズ1の次元を挿入する。
# よって、(2,) -> (1, 2) と形式が変更される。
# その上で、a, b を axis=0 方向で結合する。
c = np.r_['0,2', a, b]
print(c)
# [[1 2]
#  [5 6]
#  [8 9]]

例: a,b,c を指定する。

a = np.array([1, 2])
b = np.array([[5, 6],
              [8, 9]])

# a は2次元未満なので、サイズ1の次元を挿入して2次元にする。
# 元の配列の axis=0 の軸の位置が次元を挿入後に axis=2 となるようにサイズ1の次元を挿入する。
# よって、(2,) -> (2, 1) と形式が変更される。
# その上で、a, b を axis=1 方向で結合する。
c = np.r_['1,2,0', a, b]
print(c)
# [[1 5 6]
#  [2 8 9]]

numpy.c_

カンマ区切りで指定した配列を axis=-1 方向で結合する。

np.r_['-1,2,0', array1, array2, ..., arrayn] と同じ。

関数

numpy.c_[array1, array2, ..., arrayn]


a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [8, 9]])

# axis=-1 (a.k.a axis=1) 方向で結合する。
c = np.c_[a, b]
print(c)
# [[1 2 5 6]
#  [3 4 8 9]]

# 以下と一緒
c = np.r_['-1,2,0', a, b]
print(c)
# [[1 2 5 6]
#  [3 4 8 9]]
a = np.array([1, 2])
b = np.array([[5, 6],
              [8, 9]])

# a は2次元未満なので、サイズ1の次元を挿入して2次元にする。
# 元の配列の axis=0 の軸の位置が次元を挿入後に axis=0 となるようにサイズ1の次元を挿入する。
# よって、(2,) -> (2, 1) と形式が変更される。
# その上で、a, b を axis=-1 (a.k.a axis=1) 方向で結合する。
c = np.c_[a, b]
print(c)
# [[1 5 6]
#  [2 8 9]]

# 以下と一緒
c = np.r_['-1,2,0', a, b]
print(c)

numpy.vstack

指定した配列を axis=0 方向で結合する。
1次元配列の場合は、結合前に (1, N) と次元を拡張する。
配列の形状は、axis=0 以外は同じでなければならない。

例 a.shape=(2, 3), b.shape=(4, 3) の場合

axis=1 は a, b ともに3なのでOK
axis=0 方向に結合し、(6, 3) となる。

例 a.shape=(2, 3), b.shape=(3,) の場合
b は1次元配列なので、b.shape=(1, 3) と形状が変更される。
すると、axis=1 は a, b ともに3なのでOK
axis=0 方向に結合し、(3, 3) となる。

関数

numpy.vstack(tup)


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

# 結合前に a, b の形状は (3,) -> (1, 3) と変更される。
# axis=0 方向で結合する。
c = np.vstack([a, b])
print(c)
# [[1 2 3]
#  [4 5 6]]

# 以下と一緒
c = np.r_['0,2,-1', a, b]
print(c)
# [[1 2 3]
#  [4 5 6]]
a = np.array([[1], [2], [3]])  # a.shape=(3, 1)
b = np.array([[2], [3], [4]])  # b.shape=(3, 1)

# axis=0 方向で結合する。
c = np.vstack([a, b])  # c.shape=(6, 1)
print(c)
# [[1]
#  [2]
#  [3]
#  [2]
#  [3]
#  [4]]

# 以下と一緒
c = np.r_['0,2,-1', a, b]
print(c)
# [[1]
#  [2]
#  [3]
#  [2]
#  [3]
#  [4]]

numpy.hstack

すべて1次元配列の場合は axis=0 方向に結合する。
そうでない場合、指定した配列を axis=1 方向で結合する。
このとき、配列の形状は、axis=1 以外は同じでなければならない。

例 a.shape=(3,), b.shape=(5,) の場合

axis=0 方向に結合し、(8,) となる。

例 a.shape=(2, 1, 2), b.shape=(2, 1, 2) の場合

axis=1 以外 (axis=0, 2) は a, b ともに次元のサイズが一致するのでOK
axis=1 方向に結合し、(2, 2, 2) となる。

関数

numpy.hstack(tup)

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

# axis=0 方向で結合する。
c = np.hstack([a, b])
print(c)
# [1 2 3 4 5 6]

# 以下と一緒
c = np.r_['0', a, b]
print(c)
# [1 2 3 4 5 6]
a = np.array([[[1, 2]],
              [[3, 4]]])  # a.shape=(2, 1, 2)
b = np.array([[[5, 6]],
              [[8, 9]]])  # b.shape=(2, 1, 2)

# axis=1 方向で結合する。
c = np.hstack([a, b])  # c.shape=(2, 2, 2)
print(c)
# [[[1 2]
#   [5 6]]
#  [[3 4]
#   [8 9]]]

# 以下と一緒
c = np.r_['1', a, b]
print(c)
# [1 2 3 4 5 6]

numpy.dstack

1次元配列 (N,) の場合の場合は、結合前に (1, N, 1) と次元を拡張する。
2次元配列 (N, M) の場合は、結合前に (N, M, 1) と次元を拡張する。
指定した配列を axis=2 方向で結合する。
このとき、配列の形状は、axis=2 以外は同じでなければならない。

関数

numpy.dstack(tup)

例 1次元配列の場合

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

# a, b の形状は (3,) -> (1, 3, 1) と変更される。
# axis=2 方向で結合する。
c = np.dstack([a, b])
print(c)
# [[[1 4]
#   [2 5]
#   [3 6]]]

# 以下と一緒
c = np.r_['2,3,1', a, b]
print(c)
# [[[1 4]
#   [2 5]
#   [3 6]]]

例 2次元配列の場合


a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [8, 9]])

# a, b の形状は (2, 2) -> (2, 2, 1) と変更される。
# axis=2 方向で結合する。
c = np.dstack([a, b])
print(c)
# [[[1 4]
#   [2 5]
#   [3 6]]]

# 以下と一緒
c = np.r_['2,3,0', a, b]
print(c)
# [[[1 4]
#   [2 5]
#   [3 6]]]

numpy.stack

配列の指定した位置 axis に次元を挿入し、その axis 方向で結合する。

関数

numpy.stack(arrays, axis=0, out=None)

a = np.random.randn(3, 4)
b = np.random.randn(3, 4)

# a, b の形状は (3, 4) -> (1, 3, 4) と変更される。
# その後、axis=0 方向で結合する。
c = np.stack([a, b], axis=0)
print(c.shape)  # (2, 3, 4)

# a, b の形状は (3, 4) -> (3, 1, 4) と変更される。
# その後、axis=1 方向で結合する。
c = np.stack([a, b], axis=1)
print(c.shape)  # (3, 2, 4)

# a, b の形状は (3, 4) -> (3, 4, 1) と変更される。
# その後、axis=1 方向で結合する。
c = np.stack([a, b], axis=2)
print(c.shape)  # (3, 4, 2)

numpy.column_stack

1次元配列は、末尾にサイズ1の次元を追加し、2次元配列にする。
axis=1 方向で結合する。

関数

numpy.column_stack(tup)


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

# 結合前に a, b の形状は (3,) -> (3, 1) と形状が変更される。
# axis=1 方向で結合する。
c = np.column_stack([a, b])
print(c)
# [[1 4]
#  [2 5]
#  [3 6]]

# 以下と一緒
c = np.r_['-1,2,0', a, b]
print(c)
# [[1 4]
#  [2 5]
#  [3 6]]
a = np.array([1, 2])
b = np.array([[5, 6],
              [8, 9]])

# 結合前に a の形状は (2,) -> (2, 1) と次元が追加される。
# axis=-1 方向で結合する。
c = np.column_stack([a, b])
print(c)
# [[1 5 6]
#  [2 8 9]]

# 以下と一緒
c = np.r_['-1,2,0', a, b]
print(c)
# [[1 5 6]
#  [2 8 9]]

numpy.concatenate

配列の指定した axis 方向で結合する。

関数

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

a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [8, 9]])

# axis=1 方向で結合する。
c = np.concatenate([a, b], axis=1)
print(c)
# [[1 2 5 6]
#  [3 4 8 9]]

# 以下と一緒
c = np.r_['1', a, b]
print(c)
# [[1 2 5 6]
#  [3 4 8 9]]

numpy.block

配列のブロック状に結合する。

関数

numpy.block(arrays)


配列を複数の配列に分割する。

名前 説明
numpy.split 配列を指定した axis 方向で分割する。
numpy.array_split 配列を指定した axis 方向で分割する。
numpy.vsplit 配列を axis=0 方向で分割する。
numpy.hsplit 配列を axis=1 方向で分割する。
numpy.dsplit 配列を axis=2 方向で分割する。

numpy.split

配列を分割する。

関数

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

例: indices_or_sections に int を指定した場合

a = np.arange(9)

# a -> a[:3], a[3:6], a[6:] と分割する。
b = np.split(a, 3)
print(b)  # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

# 9 / 2 は割り切れないので、等分できないためエラーとなる。
b = np.split(a, 2)
# ValueError: array split does not result in an equal division

例: indices_or_sections にリストを指定した場合

b = np.split(a, [2, 5])

# a -> a[:2], a[2:5], a[5:] と分割する。
print(b)  # [array([0, 1]), array([2, 3, 4]), array([5, 6, 7, 8])]

numpy.array_split

配列を分割する。

関数

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

a = np.arange(9)

# a -> a[:5], a[5:] と分割する。
b = np.array_split(a, 2)
print(b)  # [array([0, 1, 2, 3, 4]), array([5, 6, 7, 8])]

numpy.vsplit

配列を axis=0 方向で分割する。

関数

numpy.vsplit(ary, indices_or_sections)

a = np.array([[1, 2],
              [3, 4],
              [5, 6],
              [7, 8]])

# a -> a[:2], a[2:] と分割する。
b = np.vsplit(a, 2)
print(b)
# [array([[1, 2],
#        [3, 4]]),
#  array([[5, 6],
#        [7, 8]])]

numpy.hsplit

配列を axis=1 方向で分割する。

関数

numpy.hsplit(ary, indices_or_sections)

a = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8]])

# a -> a[:, :2], a[:, 2:] と分割する。
b = np.hsplit(a, 2)
print(b)
# [array([[1, 2],
#        [5, 6]]),
#  array([[3, 4],
#        [7, 8]])]

numpy.dsplit

配列を axis=2 方向で分割する。

関数

numpy.dsplit(ary, indices_or_sections)

a = np.array([[[ 0,  1,  2,  3],
               [ 4,  5,  6,  7],
               [ 8,  9, 10, 11]]])

# a -> a[:, :, :2], a[:, :, 2:] と分割する。
b = np.dsplit(a, 2)
print(b)
# [array([[[0, 1],
#         [4, 5],
#         [8, 9]]]),
#  array([[[ 2,  3],
#         [ 6,  7],
#         [10, 11]]])]

要素を追加、挿入、削除する。

名前 説明
numpy.append 配列に値を追加する。
numpy.insert 配列に値を挿入する。
numpy.delete 配列から要素を削減する。
numpy.resize 配列の形状を拡大縮小する。
numpy.trim_zeros 1次元配列の0の要素を削除する。
numpy.unique 配列の重複する要素を削除する。

numpy.append

axis を指定しない場合は1次元配列にした上で末尾に値を追加する。
axis を指定した場合、配列の指定した axis の末尾に値を追加する。

関数

numpy.append(arr, values, axis=None)

例 axis を指定しない場合

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

# axis を指定しない場合、a, b ともに1次元配列とし、a の末尾に b を追加する。
c = np.append(a, b)
print(c)  # [1 2 3 4 5 6]

例 axis=0 を指定した場合


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

# axis=0 の末尾に追加する。
c = np.append(a, b, axis=0)
print(c)
# [[1 2]
#  [3 4]
#  [5 6]]

例 axis=1 を指定した場合


a = np.array([[1, 2],
              [3, 4]])  # a.shape=(2, 2)
b = np.array([[5],
              [6]])  # a.shape=(2, 1)

# axis=1 の末尾に追加する。
c = np.append(a, b, axis=1)
print(c)
# [[1 2 5]
#  [3 4 6]]

numpy.insert

axis を指定しない場合は1次元配列にした上でインデックス obj の直前に値を挿入する。
axis を指定した場合、配列の指定した axis のインデックス obj の直前に値を挿入する。

関数

numpy.insert(arr, obj, values, axis=None)

例 axis を指定しない場合

a = np.array([[1, 2],
              [3, 4]])

# a を1次元配列にし、インデックス1の直前に値5を挿入する。
b = np.insert(a, 1, 5)
print(b)  # [1 5 2 3 4]

例 axis を指定した場合


a = np.array([[1, 2],
              [3, 4]])

# axis=0 のインデックス1の直前に値 [5, 6] を挿入する。
b = np.insert(a, 1, [5, 6], axis=0)
print(b)
# [[1 2]
#  [5 6]
#  [3 4]]


a = np.array([[1, 2],
              [3, 4]])

# axis=1 のインデックス1の直前に値 [5, 6] を挿入する。
b = np.insert(a, 1, [5, 6], axis=1)
print(b)
# [[1 5 2]
#  [3 6 4]]

numpy.delete

axis を指定しない場合は1次元配列にした上でインデックス obj の値を削除する。
axis を指定した場合、配列の指定した axis のインデックス obj の値を削除する。

関数

numpy.delete(arr, obj, axis=None)

例 axis を指定しない場合

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# a を1次元配列にし、インデックス1の値を削除する。
b = np.delete(a, 1)
print(b)  # [1 3 4 5 6 7 8 9]

例 axis を指定した場合


a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# axis=0 のインデックス1の値を削除する。
b = np.delete(a, 1, axis=0)
print(b)
# [[1 2 3]
#  [7 8 9]]


a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# axis=1 のインデックス1の値を削除する。
b = np.delete(a, 1, axis=1)
print(b)
# [[1 3]
#  [4 6]
#  [7 9]]

例 obj を複数指定した場合


a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# axis=1 のインデックス0, 2の値を削除する。
b = np.delete(a, [0, 2], axis=1)
print(b)
# [[2]
#  [5]
#  [8]]

numpy.resize

配列の大きさを変更する。

関数

numpy.resize(a, new_shape)

例 元の形状より小さい場合


a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 配列の形状を (3, 3) から (2, 2) に縮小する。
b = np.resize(a, (2, 2))
print(b)
# [[1 2]
#  [3 4]]

例 元の形状より大きい場合


a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 配列の形状を (3, 3) から (5, 5) に拡大する。
b = np.resize(a, (5, 5))
print(b)
# [[1 2 3 4 5]
#  [6 7 8 9 1]
#  [2 3 4 5 6]
#  [7 8 9 1 2]
#  [3 4 5 6 7]]

numpy.trim_zeros

1次元配列の0要素を削除した配列を返す。

関数

numpy.trim_zeros(filt, trim='fb')

a = np.array([0, 1, 2, 0, 2, 0])

b = np.trim_zeros(a)
print(b)  # [1 2 0 2]

numpy.unique

配列から重複した要素を削除した配列を返す。

関数

numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)

a = np.array([0, 1, 2, 0, 2, 0])

b = np.unique(a)
print(b)  # [0 1 2]