Numpy reshapeの基本と使い方、異なる配列操作との違い、応用も紹介!

はじめに

numpy reshapeについて紹介します。reshapeはnumpyにおいて、配列の形状を変換するための関数です。この記事では、numpy reshapeの基本的な使い方と応用例を紹介します。

numpy reshapeの使い方

numpy reshapeは、以下のように使います。

import numpy as np

# 変換前の配列
a = np.array([[1, 2], [3, 4], [5, 6]])

# 形状を変換
b = np.reshape(a, (2, 3))

print(b)

この場合、aという3×2の形状を持つ配列を、2×3の形状に変換しています。reshapeでは、第1引数に変換前の配列、第2引数に変換後の形状をタプルで指定します。

reshapeを用いた配列の形状変換は、新しい配列を返します。そのため、変換前後で配列の要素数が異なる場合、要素の切り捨てや補間が行われることに注意してください。

reshapeによる配列の変形例

以下は、reshapeを使った配列の変形例です。

import numpy as np

# 1次元配列を2次元配列に変換
a = np.array([1, 2, 3, 4])
b = np.reshape(a, (2, 2))
print(b) # [[1 2], [3 4]]

# 3次元配列を2次元配列に変換
a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = np.reshape(a, (2, 4))
print(b) # [[1 2 3 4], [5 6 7 8]]

# 画像のピクセルデータを1次元に変換
# 画像は28x28の形状を持つ
a = np.random.randint(0, 255, size=(28, 28))
b = np.reshape(a, (784,))
print(b) # [199  87  86 ... 159 203 171]

reshapeと他の配列操作の違い

reshapeと異なる配列操作には、flattenやsqueezeなどがあります。これらの関数を使うことで、reshapeと同様の操作が行えることがありますが、異なる点もあります。

import numpy as np

# flattenを使った例
a = np.array([[1, 2], [3, 4]])
b = np.flatten(a)
print(b) # [1 2 3 4]

# squeezeを使った例
a = np.array([[[1, 2], [3, 4]]])
b = np.squeeze(a)
print(b) # [[1, 2], [3, 4]]

flattenは、多次元配列を1次元配列に平坦化することができます。一方、squeezeは、配列内に不要な次元がある場合にそれらを削除することができます。

reshapeを取り巻くメソッド・関数群

reshapeと関連するnumpyのメソッドや関数を紹介します。

ravel

多次元配列を1次元配列に平坦化します。

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.ravel(a)
print(b) # [1 2 3 4]

resize

配列の形状を変換します。このとき、元の配列を上書きするため、要素数が異なる場合は切り捨てまたは補間が起きることに注意してください。

import numpy as np

# 変換前の配列
a = np.array([[1, 2], [3, 4], [5, 6]])

# 変換後の配列
np.resize(a, (2, 3))
# [[1, 2, 3], [4, 5, 6]]

numpy reshapeの応用例

以下は、reshapeを応用した具体的な例です。

配列のスライシング

reshapeを使用することで、配列を複数の小さな配列に分割することができます。

import numpy as np

# 配列を4つの小さな配列に分割する
a = np.array([1, 2, 3, 4, 5, 6, 7, 8])
b = np.reshape(a, (4, 2))
c = b[:, 0]
d = b[:, 1]

print(c) # [1 3 5 7]
print(d) # [2 4 6 8]

条件分岐による形状の変更

numpy reshapeを使うことで、条件に基づいた形状変更が行えます。

import numpy as np

a = np.array([1, 2, 3, 4, 5, 6])
b = np.reshape(a, (-1, 2))
if b.shape[1] == 1:
    b = np.reshape(b, (b.shape[0],))

print(b) # [1 2 3 4 5 6]

この例では、reshapeによって、元の配列を2×3行列に変換しています。その後、条件分岐によって、もし1列しか持たない行列であれば1次元配列に再変換しています。

おわりに

numpy reshapeは、配列操作の基本的な機能の一つです。reshapeを使うことで、画像処理や機械学習などの分野でよく用いられる多次元配列の形状変換をスムーズに行うことができます。しかし、要素数の切り捨てや補間に気をつけ、適切に使用するようにしましょう。

コメント

タイトルとURLをコピーしました