NumPy配列の形状操作とは?
NumPyはPythonの強力な数値計算ライブラリであり、配列の形状(シェイプ)を柔軟に変更するためのさまざまな関数を提供しています。データの整形は、データ分析や機械学習において欠かせない操作のひとつです。例えば、画像処理ではピクセルデータのリサイズや回転を行う際に、時系列データ解析ではデータを適切な形に整えたり、ニューラルネットワークの入力データの準備に役立ちます。本記事では、reshape
、transpose
、resize
を活用して、NumPy配列の形状を効果的に変更する方法を解説します。
1. NumPy配列の基本的な形状
まずは、基本的なNumPy配列を作成し、形状を確認してみましょう。
import numpy as np
# 1次元配列の作成
g = np.arange(15)
print(g)
print(g.shape)
出力:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
(15,)
配列 g
は1次元(15要素)の配列であり、その形状は(15,)
となっています。
2. reshape()
を使った形状変更
2次元配列への変換
reshape()
を使うと、1次元の配列を2次元以上に変更できます。
# 3行5列の2次元配列に変換
g_reshaped = g.reshape((3, 5))
print(g_reshaped)
出力:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
異なる形状に変更する場合、データの総数(要素数)は変えずに配置を変更します。ただし、要素数が一致しない形状に変更しようとすると、エラーが発生します。例えば、15個の要素を4×4の行列に変換しようとすると、ValueError: cannot reshape array of size 15 into shape (4,4)
というエラーが表示されます。形状変更の際は、元のデータの要素数と一致する形状を指定する必要があります。
列数を変更
h = g.reshape((5,3))
print(h)
出力:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
3. transpose()
と T
を使った転置
transpose()
や T
を使うと、行と列を入れ替えられます。
print(h.T) # または h.transpose()
出力:
array([[ 0, 3, 6, 9, 12],
[ 1, 4, 7, 10, 13],
[ 2, 5, 8, 11, 14]])
転置を行うことで、データの見方を変えたり、行列計算を効率的に行うことができます。例えば、線形代数においては行列の積を求める際に転置が必要となることがあり、畳み込みニューラルネットワーク(CNN)では、カーネル演算の最適化のために転置が活用されます。また、データ解析では、転置を使って列データを行データに変換し、統計処理や可視化を行いやすくすることもできます。
4. resize()
を使ったサイズ変更
resize()
は reshape()
と異なり、要素数が合わない場合にデータを繰り返して補完することができます。ただし、この機能を使用すると、意図しないデータの繰り返しが発生する可能性があるため注意が必要です。特に、機械学習やデータ分析の前処理では、resize()
によってデータの整合性が崩れる可能性があります。例えば、resize()
でアップサイジングを行うと元のデータが繰り返されるため、統計的な分析に影響を与える場合があります。そのため、要素数が異なる場合は、reshape()
や pad()
などの適切な代替手法を検討することを推奨します。
2次元へのダウンサイジング
print(np.resize(g, (3,1)))
出力:
array([[0],
[1],
[2]])
2次元へのアップサイジング
print(np.resize(g, (5,4)))
出力:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 0],
[ 1, 2, 3, 4]])
要素数が足りない場合は、データが繰り返されて補完されます。ただし、resize()
を使用すると、意図しないデータの繰り返しが発生する可能性があるため注意が必要です。特に、大規模なデータ処理や機械学習の前処理では、適切な形状にリサイズできているかを事前に確認することが重要です。
5. 配列のスタッキング(結合)
配列のスタッキングとは、複数のNumPy配列を結合し、新しい配列を作成する操作です。これは、データを統合したり、行列を拡張したりする際に便利です。例えば、異なるセンサーからのデータを統合して時系列データを作成したり、機械学習において複数の特徴量を組み合わせて入力データを拡張したりするのに役立ちます。また、画像処理では、複数の画像を連結してバッチ処理を行う際にも活用されます。スタッキングには、配列を水平方向に結合するhstack()
、垂直方向に結合するvstack()
などの方法があります。
水平スタッキング
print(np.hstack((h, 2 * h)))
出力:
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16],
[ 9, 10, 11, 18, 20, 22],
[12, 13, 14, 24, 26, 28]])
鉛直スタッキング
print(np.vstack((h, 0.5 * h)))
出力:
array([[ 0. , 1. , 2. ],
[ 3. , 4. , 5. ],
[ 6. , 7. , 8. ],
[ 9. , 10. , 11. ],
[12. , 13. , 14. ],
[ 0. , 0.5, 1. ],
[ 1.5, 2. , 2.5],
[ 3. , 3.5, 4. ],
[ 4.5, 5. , 5.5],
[ 6. , 6.5, 7. ]])
6. まとめ
NumPyの配列形状操作は、データを効率的に扱うために欠かせないスキルです。次のステップとして、NumPyのブロードキャストを学ぶことで、異なる形状の配列間の計算を効率化する方法を理解できます。また、メモリ管理に関する知識を深めることで、大規模データ処理時のパフォーマンスを最適化できます。これらのトピックを学ぶことで、より高度なデータ処理技術を習得し、実践に活かせるでしょう。reshape()
での形状変更、transpose()
での転置、resize()
を使ったサイズ調整を適切に活用することで、データの前処理や機械学習のデータ準備をより効率的に行うことができます。これらの操作を活用し、より柔軟なデータ処理を行いましょう。