Pynote

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

numpy - 形状、軸を変更する関数を整理する。

形状を変更する。

名前 説明
numpy.reshape 形状を変更する。
numpy.ravel 形状を1次元配列にする。

numpy.reshape

配列の要素数を変えないで、形状を変更する。

関数

numpy.reshape(a, newshape, order='C')

a = np.arange(12)

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

配列の要素数が変ってしまう形状の変更はできないことに注意する。
以下は (12,) の配列の形状を (5, 5) に変更しようとしているが、変更前の要素数は12、変更後の要素数5 \times 5 = 25 となり、要素数が変わってしまう。
このような変更はできないので、エラーになる。

a = np.arange(12)
b = np.reshape(a, (5, 5))
# ValueError: cannot reshape array of size 12 into shape (5,5)

numpy.ravel

形状を1次元配列にする。

関数

numpy.ravel(a, order='C')

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

b = np.ravel(a)
print(b)  # [ 0  1  2  3  4  5  6  7  8  9 10 11]

軸の位置を変更する。

名前 説明
numpy.transpose 軸の順番に入れ替える。
numpy.moveaxis 軸を指定した位置に移動する。
numpy.swapaxes 2つの軸を入れ替える。

numpy.transpose

軸を axes の順番に入れ替える。

関数

numpy.transpose(a, axes=None)

例: axes を指定しない場合は、元の軸を反転させる。



a = np.zeros((3, 4, 5))
print(a.shape)  # (3, 4, 5)

b = np.transpose(a)
print(b.shape)  # (5, 4, 3)

例: axes を指定した場合は、元の軸を指定した位置に移動する。


a = np.zeros((3, 4, 5))
print(a.shape)  # (3, 4, 5)

b = np.transpose(a, axes=(1, 0, 2))
print(b.shape)  # (4, 3, 5)

numpy.moveaxis

軸の位置を source から destination に移動する。

関数

numpy.moveaxis(a, source, destination)


a = np.zeros((3, 4, 5))
print(a.shape)  # (3, 4, 5)

b = np.moveaxis(a, 1, 2)
print(b.shape)  # (3, 5, 4)

numpy.swapaxes

2つの軸 axis1 と axis2 を入れ替える。

関数

numpy.swapaxes(a, axis1, axis2)


a = np.zeros((3, 4, 5))
print(a.shape)  # (3, 4, 5)

b = np.swapaxes(a, 1, 0)
print(b.shape)  # (4, 3, 5)

軸を追加、削減する。

名前 説明
numpy.squeeze 配列に次元1の軸を削減する。
numpy.expand_dims 配列に次元1の軸を挿入する。
numpy.atleast_1d 配列の次元が1未満の場合はサイズ1の次元を追加し、1次元配列にする。
numpy.atleast_2d 配列の次元が2未満の場合はサイズ1の次元を追加し、2次元配列にする。
numpy.atleast_3d 配列の次元が3未満の場合はサイズ1の次元を追加し、3次元配列にする。

numpy.squeeze

次元1の軸を削減する。

関数

numpy.squeeze(a, axis=None)

例: axis を指定しない場合は次元1の軸をすべて削減する。


a = np.zeros((3, 1, 1, 1))
print(a.shape)  # (3, 1, 1, 1)

b = np.squeeze(a)
print(b.shape)  # (3,)

例: 指定した次元1の axis を削減する。


a = np.zeros((3, 1, 1, 1))
print(a.shape)  # (3, 1, 1, 1)

b = np.squeeze(a, axis=1)
print(b.shape)  # (3, 1, 1)

b = np.squeeze(a, axis=(1, 3))
print(b.shape)  # (3, 1)

numpy.expand_dims

次元1の軸を指定した axis の前に挿入する。

関数

numpy.expand_dims(a, axis)


a = np.zeros((3, 4))
print(a.shape)  # (3, 1, 1, 1)

b = np.expand_dims(a, 0)
print(b.shape)  # (1, 3, 4)

b = np.expand_dims(a, 1)
print(b.shape)  # (3, 1, 4)

b = np.expand_dims(a, 2)
print(b.shape)  # (3, 4, 1)

b = np.expand_dims(a, -1)
print(b.shape)  # (3, 4, 1)

numpy.atleast_1d

形状が1次元未満の場合は、次元1の軸を挿入して1次元にする。

  • 0次元: () → (1,)
  • 1次元以上: 変更なし

関数

numpy.atleast_1d(*arys)

d0 = np.zeros(())  # 0次元
d1 = np.zeros((3,))  # 1次元
d2 = np.zeros((3, 4))  # 2次元
d3 = np.zeros((3, 4, 5))  # 3次元
d4 = np.zeros((3, 4, 5, 6))  # 4次元

# 変換後の形状
print(np.atleast_1d(d0).shape)  # (1,)
print(np.atleast_1d(d1).shape)  # (3,)
print(np.atleast_1d(d2).shape)  # (3, 4)
print(np.atleast_1d(d3).shape)  # (3, 4, 5)
print(np.atleast_1d(d4).shape)  # (3, 4, 5, 6)

numpy.atleast_2d

形状が2次元未満の場合は、次元1の軸を挿入して2次元にする。

  • 0次元: () → (1, 1)
  • 1次元: (N) → (1, N)
  • 2次元以上: 変更なし

関数

numpy.atleast_2d(*arys)

d0 = np.zeros(())  # 0次元
d1 = np.zeros((3,))  # 1次元
d2 = np.zeros((3, 4))  # 2次元
d3 = np.zeros((3, 4, 5))  # 3次元
d4 = np.zeros((3, 4, 5, 6))  # 4次元

# 変換後の形状
print(np.atleast_2d(d0).shape)  # (1, 1)
print(np.atleast_2d(d1).shape)  # (1, 3)
print(np.atleast_2d(d2).shape)  # (3, 4)
print(np.atleast_2d(d3).shape)  # (3, 4, 5)
print(np.atleast_2d(d4).shape)  # (3, 4, 5, 6)

numpy.atleast_3d

形状が3次元未満の場合は、次元1の軸を挿入して3次元にする。

  • 0次元: () → (1, 1, 1)
  • 1次元: (N) → (1, N, 1)
  • 2次元: (N, M) → (N, M, 1)
  • 3次元以上: 変更なし

関数

numpy.atleast_3d(*arys)

d0 = np.zeros(())  # 0次元
d1 = np.zeros((3,))  # 1次元
d2 = np.zeros((3, 4))  # 2次元
d3 = np.zeros((3, 4, 5))  # 3次元
d4 = np.zeros((3, 4, 5, 6))  # 4次元

# 変換後の形状
print(np.atleast_3d(d0).shape)  # (1, 1, 1)
print(np.atleast_3d(d1).shape)  # (1, 3, 1)
print(np.atleast_3d(d2).shape)  # (3, 4, 1)
print(np.atleast_3d(d3).shape)  # (3, 4, 5)
print(np.atleast_3d(d4).shape)  # (3, 4, 5, 6)