ITエンジニア ノイのブログ

ITエンジニアのノイです。 YouTubeで ITエンジニアのお勉強という学習用の動画を公開しています。チャンネル登録お願いします!https://m.youtube.com/channel/UCBKfJIMVWXd3ReG_FDh31Aw/playlists

np.reshapeによる行列の変形

np.reshape

reshape()は、NumPyや他のいくつかのプログラミングライブラリで提供されている関数の一つです。この関数は、配列や行列の形状(サイズ)を変更するために使用されます。

reshape()関数の基本的な構文

numpy.reshape(array, new_shape, order='C')

ここで、arrayは変形したい配列や行列を指定します。new_shapeは、新しい形状を指定するタプルまたは整数値の引数です。orderはオプションの引数で、要素の順序を指定します(デフォルトは'C'です)。

reshape()関数は、元の配列を変更せずに、指定した新しい形状の配列を返します。ただし、変形後の配列の要素数と元の配列の要素数が一致している必要があります。つまり、変形後の配列の総要素数は元の配列の総要素数と同じでなければなりません。

実装例

import numpy as np

# 1次元配列を2行3列の行列に変形する
arr1 = np.array([1, 2, 3, 4, 5, 6])
reshaped_arr1 = np.reshape(arr1, (2, 3)) #縦2横3
print(reshaped_arr1)
# 出力: [[1 2 3]
#        [4 5 6]]

# 2次元配列を1次元配列に変形する
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
reshaped_arr2 = np.reshape(arr2, 6)
print(reshaped_arr2)
# 出力: [1 2 3 4 5 6]

# 行列の形状を変更する(行列の要素数は変わらない)
arr3 = np.array([[1, 2], [3, 4], [5, 6]])
reshaped_arr3 = np.reshape(arr3, (2, 3), order='F')
print(reshaped_arr3)
# 出力: [[1 5 4]
#        [3 2 6]]

これらの例では、reshape()関数を使用して配列や行列の形状を変更しています。new_shapeに指定するタプルの要素数や整数値の数によって、変形後の形状が異なることに注意してください。また、order引数を使用すると、要素の順序を制御することができます。

order引数

変形後の配列の要素がメモリ内でどのような順序で配置されるかを制御することができます。

order引数には以下の2つの値を指定

  • 'C'(デフォルト): C言語スタイルの行優先(row-major)順序を使用します。これは、配列の各行を連続した領域に配置し、行ごとにメモリが割り当てられることを意味します。NumPyの多次元配列のデフォルトの要素順序です。

  • 'F': フォートランスタイルの列優先(column-major)順序を使用します。これは、配列の各列を連続した領域に配置し、列ごとにメモリが割り当てられることを意味します。

order引数の使用例

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])
reshaped_arr_C = np.reshape(arr, (3, 2), order='C')
reshaped_arr_F = np.reshape(arr, (3, 2), order='F')

print("C order:")
print(reshaped_arr_C)
# 出力:
# [[1 2]
#  [3 4]
#  [5 6]]

print("F order:")
print(reshaped_arr_F)
# 出力:
# [[1 5]
#  [4 3]
#  [2 6]]

元の2次元配列arr(3, 2)の形状に変形しています。order='C'を指定すると、reshaped_arr_CC言語スタイルの行優先順序で要素が配置されます。一方、order='F'を指定すると、reshaped_arr_Fはフォートランスタイルの列優先順序で要素が配置されます。

reshape(-1, 1)の場合

reshape(-1, 1)は、NumPyのreshape()関数を使用して、配列や行列を1列のベクトルに変形するための一般的な表現です。この形式を使用すると、元の配列の要素数に基づいて、変形後の配列の行数が自動的に計算されます。

具体的には、reshape(-1, 1)という形式を使うと、元の配列の要素数に応じて変形後の配列の行数が決まりますが、列数は1となります。つまり、変形後の配列は列方向に1列を持つことになります。

以下に例を示します:

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6])
reshaped_arr = np.reshape(arr, (-1, 1))
print(reshaped_arr)
# 出力:
# [[1]
#  [2]
#  [3]
#  [4]
#  [5]
#  [6]]

上記の例では、元の配列arrは6つの要素を持っています。reshape(-1, 1)を使用して変形すると、要素数に基づいて行数が6となり、列数が1となる配列が作成されます。

reshape(-1, 1)のような形式を使用すると、元の配列の形状を保持しながら、特定の次元に要素数に基づいて自動的にサイズを調整することができます。これは、機械学習やデータ処理の場合に、データの整形や特徴ベクトルの表現などでよく使用されます。

転置との関係

arr = np.array([1, 2, 3, 4, 5, 6])の場合、reshape(-1, 1)と転置は同じ結果になります。 - reshapeの場合 reshape(-1, 1)は、元の1次元配列を1列の2次元配列に変形します。具体的には、要素数に基づいて行数が計算され、列数が1になります。 - 転置の場合 転置(transpose)は、行と列を入れ替えて新しい行列を作成します。しかし、1次元配列は行列ではなく、転置する必要もないため、元の1次元配列がそのまま返されます。

コード例

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6])

reshaped_arr = np.reshape(arr, (-1, 1))
print(reshaped_arr)
# 出力:
# [[1]
#  [2]
#  [3]
#  [4]
#  [5]
#  [6]]

transposed_arr = arr.T
print(transposed_arr)
# 出力:
# [1 2 3 4 5 6]

上記のコードでは、元の1次元配列arrreshape(-1, 1)で1列の2次元配列に変形しています。transposed_arrarrの転置を表していますが、元の1次元配列がそのまま返されています。

つまり、arr = np.array([1, 2, 3, 4, 5, 6])の場合、reshape(-1, 1)と転置は同じ結果を返します。

youtu.be