[Python] NumPy – 配列の次元数を変更する方法

NumPyでは、配列の次元数を変更するために主にreshape()メソッドを使用します。

reshape()は、元の配列の要素数を保ったまま、新しい形状に変換します。

例えば、1次元配列を2次元や3次元に変換することが可能です。

reshape()の引数には、新しい形状をタプルで指定します。

次元数を増やす場合は、np.newaxisexpand_dims()を使うこともできます。

この記事でわかること
  • NumPyのreshape()の使い方
  • 次元数を増やす方法の解説
  • 次元数を減らす方法の実践
  • 画像データの次元変更の例
  • 機械学習データの前処理方法

目次から探す

reshape()を使った次元数の変更

NumPyのreshape()関数は、配列の形状を変更するための非常に便利な機能です。

この関数を使うことで、配列の次元数を簡単に変更することができます。

以下では、reshape()の基本的な使い方や、引数の指定方法、次元数を増減させる方法について詳しく解説します。

reshape()の基本的な使い方

reshape()関数は、配列の形状を変更するために使用します。

基本的な構文は以下の通りです。

import numpy as np
# 1次元配列を作成
array_1d = np.array([1, 2, 3, 4, 5, 6])
# reshape()を使って2次元配列に変換
array_2d = array_1d.reshape(2, 3)
print(array_2d)
[[1 2 3]
 [4 5 6]]

この例では、1次元配列を2行3列の2次元配列に変換しています。

reshape()の引数の指定方法

reshape()関数では、変更後の配列の形状を引数として指定します。

引数はタプル形式で渡すことができます。

以下の例では、3次元配列に変換しています。

import numpy as np
# 1次元配列を作成
array_1d = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
# reshape()を使って3次元配列に変換
array_3d = array_1d.reshape(2, 3, 2)
print(array_3d)
[[[ 1  2]
  [ 3  4]
  [ 5  6]]
 [[ 7  8]
  [ 9 10]
  [11 12]]]

このように、reshape()を使うことで、任意の次元数に配列を変換することができます。

reshape()で次元数を増やす場合

次元数を増やす場合、reshape()を使って新しい次元を追加することができます。

例えば、1次元配列を2次元配列に変換する場合、次のようにします。

import numpy as np
# 1次元配列を作成
array_1d = np.array([1, 2, 3, 4])
# reshape()を使って2次元配列に変換
array_2d = array_1d.reshape(2, 2)
print(array_2d)
[[1 2]
 [3 4]]

この例では、1次元配列を2行2列の2次元配列に変換しています。

reshape()で次元数を減らす場合

次元数を減らす場合も、reshape()を使って配列の形状を変更できます。

例えば、3次元配列を2次元配列に変換する場合、次のようにします。

import numpy as np
# 3次元配列を作成
array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# reshape()を使って2次元配列に変換
array_2d = array_3d.reshape(4, 2)
print(array_2d)
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

このように、次元数を減らすことも簡単に行えます。

reshape()の注意点:要素数の一致

reshape()を使用する際には、元の配列の要素数と変更後の配列の要素数が一致している必要があります。

例えば、元の配列が6つの要素を持っている場合、変更後の配列も6つの要素を持たなければなりません。

以下の例では、要素数が一致しないためエラーが発生します。

import numpy as np
# 1次元配列を作成
array_1d = np.array([1, 2, 3, 4, 5, 6])
# reshape()でエラーが発生する例
array_error = array_1d.reshape(3, 3)  # 要素数が一致しない

このコードを実行すると、次のようなエラーが表示されます。

ValueError: cannot reshape array of size 6 into shape (3,3)

このように、reshape()を使用する際は、要素数の一致に注意が必要です。

次元数を増やす方法

NumPyでは、配列の次元数を増やすためにnp.newaxisexpand_dims()を使用することができます。

これらの方法を使うことで、配列に新しい次元を追加することが可能です。

以下では、それぞれの方法について詳しく解説します。

np.newaxisを使った次元の追加

np.newaxisを使うと、既存の配列に新しい次元を追加することができます。

以下の例では、1次元配列に新しい次元を追加して2次元配列に変換しています。

import numpy as np
# 1次元配列を作成
array_1d = np.array([1, 2, 3, 4])
# np.newaxisを使って次元を追加
array_2d = array_1d[np.newaxis, :]
print(array_2d)
[[1 2 3 4]]

この例では、1次元配列が1行の2次元配列に変換されています。

np.newaxisを使うことで、配列の形状を簡単に変更できます。

expand_dims()を使った次元の追加

expand_dims()関数も、配列に新しい次元を追加するために使用されます。

expand_dims()は、追加する次元の位置を指定することができるため、より柔軟に次元を増やすことができます。

以下の例では、1次元配列に新しい次元を追加しています。

import numpy as np
# 1次元配列を作成
array_1d = np.array([1, 2, 3, 4])
# expand_dims()を使って次元を追加
array_2d = np.expand_dims(array_1d, axis=0)
print(array_2d)
[[1 2 3 4]]

この例でも、expand_dims()を使って1次元配列を1行の2次元配列に変換しています。

axis引数で新しい次元を追加する位置を指定できます。

np.newaxisとexpand_dims()の違い

np.newaxisexpand_dims()は、どちらも次元を追加するために使用されますが、いくつかの違いがあります。

以下の表にまとめました。

スクロールできます
特徴np.newaxisexpand_dims()
使用方法配列のインデックスに指定関数を呼び出して指定
次元の位置指定インデックスで指定axis引数で指定
可読性簡潔で直感的明示的で柔軟性が高い

このように、np.newaxisは簡潔さが特徴で、expand_dims()は柔軟性が高いという違いがあります。

用途に応じて使い分けると良いでしょう。

次元数を減らす方法

NumPyでは、配列の次元数を減らすためにsqueeze()reshape()を使用することができます。

これらの方法を使うことで、不要な次元を削除し、配列の形状を簡潔にすることが可能です。

以下では、それぞれの方法について詳しく解説します。

squeeze()を使った次元の削減

squeeze()関数は、配列の中でサイズが1の次元を削除するために使用されます。

以下の例では、3次元配列からサイズが1の次元を削除しています。

import numpy as np
# 3次元配列を作成(サイズ1の次元を含む)
array_3d = np.array([[[1]], [[2]], [[3]]])
# squeeze()を使って次元を削減
array_2d = np.squeeze(array_3d)
print(array_2d)
[1 2 3]

この例では、3次元配列からサイズが1の次元が削除され、1次元配列に変換されています。

reshape()を使った次元の削減

reshape()関数を使っても、次元数を減らすことができます。

次元を減らす際には、元の配列の要素数と一致するように新しい形状を指定する必要があります。

以下の例では、3次元配列を2次元配列に変換しています。

import numpy as np
# 3次元配列を作成
array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# reshape()を使って2次元配列に変換
array_2d = array_3d.reshape(4, 2)
print(array_2d)
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

このように、reshape()を使うことで、次元数を減らすことができます。

squeeze()の注意点:削減できる次元の条件

squeeze()を使用する際には、削減できる次元の条件に注意が必要です。

具体的には、サイズが1の次元のみが削除対象となります。

以下の例では、サイズが1でない次元は削除されません。

import numpy as np
# 3次元配列を作成(サイズ1の次元を含む)
array_3d = np.array([[[1, 2]], [[3, 4]], [[5, 6]]])
# squeeze()を使って次元を削減
array_squeezed = np.squeeze(array_3d)
print(array_squeezed)
[[1 2]
 [3 4]
 [5 6]]

この例では、サイズが1の次元が削除されず、2次元配列のまま残っています。

したがって、squeeze()を使用する際は、削減したい次元がサイズ1であることを確認する必要があります。

応用例:次元数変更の実践

次元数の変更は、さまざまなデータ処理や機械学習の前処理において非常に重要です。

ここでは、具体的な応用例をいくつか紹介します。

画像データの次元数を変更する

画像データは通常、3次元配列(高さ、幅、色チャンネル)として表現されます。

例えば、カラー画像はRGBの3つの色チャンネルを持つため、次のように次元数を変更することができます。

import numpy as np
# 画像データを模擬した3次元配列を作成(高さ、幅、色チャンネル)
image_data = np.random.rand(100, 100, 3)  # 100x100ピクセルのカラー画像
# 画像データを2次元に変換(高さ*幅, 色チャンネル)
image_reshaped = image_data.reshape(-1, 3)
print(image_reshaped.shape)
(10000, 3)

この例では、100×100ピクセルの画像データを2次元配列に変換しています。

これにより、各ピクセルの色情報を行として扱うことができます。

機械学習データの次元数を調整する

機械学習では、データの次元数を調整することがよくあります。

例えば、特徴量が1次元の配列である場合、モデルに入力するために2次元に変換する必要があります。

import numpy as np
# 特徴量データを作成(1次元配列)
features = np.array([1, 2, 3, 4, 5])
# 特徴量データを2次元に変換
features_reshaped = features.reshape(-1, 1)
print(features_reshaped)
[[1]
 [2]
 [3]
 [4]
 [5]]

このように、1次元の特徴量を2次元に変換することで、機械学習モデルに適した形式に整えることができます。

多次元配列を1次元に変換する

多次元配列を1次元に変換することもよくあります。

例えば、画像データやセンサーデータをフラットにして処理する場合です。

以下の例では、3次元配列を1次元に変換しています。

import numpy as np
# 3次元配列を作成
array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# reshape()を使って1次元に変換
array_1d = array_3d.reshape(-1)
print(array_1d)
[1 2 3 4 5 6 7 8]

この例では、3次元配列を1次元配列に変換しています。

これにより、データを一つのベクトルとして扱うことができます。

3次元配列を2次元に変換する

3次元配列を2次元に変換することも一般的です。

例えば、画像データを行列形式で処理する場合などです。

以下の例では、3次元配列を2次元に変換しています。

import numpy as np
# 3次元配列を作成
array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# reshape()を使って2次元に変換
array_2d = array_3d.reshape(4, 2)
print(array_2d)
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

このように、3次元配列を2次元配列に変換することで、データをより扱いやすい形式に整えることができます。

次元数の変更は、データ処理や機械学習の前処理において非常に重要な技術です。

よくある質問

reshape()でエラーが出るのはなぜ?

reshape()関数を使用する際にエラーが発生する主な理由は、元の配列の要素数と新しい形状の要素数が一致しないことです。

reshape()は、配列の形状を変更する際に、元の配列の要素数と新しい形状の要素数が同じである必要があります。

例えば、元の配列が6つの要素を持っている場合、次のように新しい形状を指定する必要があります。

  • 正しい例: array.reshape(2, 3)(6要素)
  • 間違った例: array.reshape(3, 3)(9要素)

このように、要素数が一致しない場合、ValueErrorが発生します。

np.newaxisとreshape()はどちらを使うべき?

np.newaxisreshape()はどちらも次元を変更するために使用されますが、使い方や目的に応じて選択することが重要です。

以下のポイントを考慮すると良いでしょう。

  • np.newaxis: 配列のインデックスに直接指定するため、簡潔で直感的です。

特定の次元を追加したい場合に便利です。

  • reshape(): 新しい形状を明示的に指定できるため、より柔軟性があります。

複数の次元を同時に変更したい場合や、特定の形状に変換したい場合に適しています。

用途に応じて、どちらの方法を使うかを選択すると良いでしょう。

squeeze()で削除できない次元があるのはなぜ?

squeeze()関数は、サイズが1の次元のみを削除することができます。

したがって、削除できない次元がある場合は、その次元のサイズが1ではないことが原因です。

例えば、次のような配列を考えてみましょう。

import numpy as np
# サイズ1の次元を含む3次元配列
array_3d = np.array([[[1, 2]], [[3, 4]], [[5, 6]]])

この配列には、サイズが1の次元(最初の次元)がありますが、他の次元(2次元目と3次元目)はサイズが2です。

このため、squeeze()を使用しても、サイズが2の次元は削除されず、元の形状のまま残ります。

array_squeezed = np.squeeze(array_3d)
print(array_squeezed.shape)  # (3, 2)

このように、squeeze()はサイズが1の次元のみを削除するため、削除できない次元がある場合は、その次元のサイズを確認する必要があります。

まとめ

この記事では、NumPyを使用して配列の次元数を変更する方法について詳しく解説しました。

具体的には、次元数を増やす方法としてnp.newaxisexpand_dims()を利用する方法、次元数を減らす方法としてsqueeze()reshape()を使う方法を紹介しました。

これらの技術を活用することで、データの前処理や機械学習モデルへの入力形式を整えることが可能になります。

次に、実際のデータ処理や機械学習のプロジェクトにおいて、これらの方法を積極的に活用してみてください。

  • URLをコピーしました!
目次から探す