Python – numpy.reshape()関数の使い方を徹底解説
numpy.reshape()とは
numpy.reshape()は、配列のデータ自体を変更することなく、配列に新しい形状(shape)を与えるためのNumPyの関数です。構文は以下の通りです。
numpy.reshape(arr, newshape, order='C')
パラメータ
numpy.reshape()は、以下のパラメータを受け付けます。
arr − 形状を変更する対象となる入力配列。
newshape − 変更後の新しい形状。整数を指定した場合は、その長さを持つ1次元配列に変換されます。また、いずれか1つの次元に-1を指定すると、その次元のサイズは他の次元から自動的に推論されます。
order − 入力配列の要素を読み込む順序を定義します。
'C' − C言語風のインデックス順序で要素を読み書きします。最後の軸のインデックスが最も速く変化し、最初の軸のインデックスは最も遅く変化します(行優先)。デフォルト値です。
'F' − Fortran風のインデックス順序で要素を読み書きします。最初の軸のインデックスが最も速く変化し、最後の軸のインデックスは最も遅く変化します(列優先)。
'A' − 配列がメモリ上で連続している場合に、Fortran風のインデックス順序で要素を読み書きします。
使用例1:newshapeに-1を指定する
まず、基本的な使用例から見ていきましょう。
# NumPyをインポート
import numpy as np
# 入力配列
x = np.array([[3,5,6], [7,8,9]])
print('入力配列 :\n', x)
# reshape()関数で形状を変更(-1により列数を自動推論)
y = np.reshape(x, (3, -1))
print('形状変更後の配列:\n', y)
出力
上記のコードを実行すると、以下のような出力が得られます。
入力配列 : [[3 5 6] [7 8 9]] 形状変更後の配列: [[3 5] [6 7] [8 9]]
この例では、newshapeの2番目の次元に-1を指定しています。全体の要素数は6個なので、3行と指定した時点で残りの列数は「6 ÷ 3 = 2」と自動的に計算され、元の2×3の配列が3×2の配列へと変換されています。
使用例2:orderパラメータを指定する
次に、orderパラメータを使った例を見てみましょう。
# NumPyをインポート
import numpy as np
# 入力配列を作成
x = np.array([[1,3,4], [4,6,7]])
print('入力配列 :\n', x)
# order='C'を指定してreshape()を実行
y = np.reshape(x, 6, order='C')
print('形状変更後の配列:\n', y)
出力
上記のコードを実行すると、以下のような出力が得られます。
入力配列 : [[1 3 4] [4 6 7]] 形状変更後の配列: [1 3 4 4 6 7]
ここではnewshapeとして整数の6を指定しているため、結果は長さ6の1次元配列になります。order='C'(デフォルト)では行優先で要素が読み込まれるため、元の2×3の配列が「[1 3 4 4 6 7]」という順序でフラット化されています。
まとめ
numpy.reshape()を使えば、元のデータを保持したまま配列の形状を自由に変換できます。特に-1を指定した次元の自動推論は非常に便利な機能なので、実際の開発でもぜひ活用してみてください。
-
Pythonで配列を右にk回転させる方法【スライスで簡単実装】
配列の右回転とは? 配列Aが与えられたとき、それを右にkステップ回転することを考えます。例えば、配列 A = [5, 7, 3, 6, 8, 1, 5, 4]、k = 3 の場合、出力は [1, 5, 4, 5, 7, 3, 6, 8] となります。 各ステップでの配列の変化は以下の通りです。 1回転後:[4, 5, 7, 3, 6, 8, 1, 5] 2回転後:[5, 4, 5, 7, 3, 6, 8, 1] 3回転後:[1, 5, 4, 5, 7, 3, 6, 8] つまり、1回転ごとに末尾の要素が先頭に移動し、残りの要素が一つずつ後ろにずれていくイメージです。 解法のアプローチ こ
-
【NumPy入門】Pythonでの基本的なスライシングと高度なインデックス参照の使い方
NumPyのndarray(多次元配列)へのインデックス参照は、標準的なPythonの x[obj] 構文を使って行えます。ここで x は配列、obj は選択条件(セレクタ)です。NumPyで利用できるインデックス参照には、主に以下の3種類があります。フィールドアクセス(field access)基本的なスライシング(basic slicing)高度なインデックス参照(advanced indexing)どの種類のインデックス参照が適用されるかは、obj の内容によって決まります。この記事では、特に「基本的なスライシング」と「高度なインデックス参照」に焦点を当てて解説します。さらに、高度なイン