この記事ではshape
属性の使用例をご紹介します。
shape
属性は配列の形状(次元数と各次元のサイズ)を確認するのに役立ちます。
特に、行列計算では配列の形状が重要となるので、これを確認する方法はマスターしておきたいですね。
ぜひ参考にしてみてください!
shape属性とは?
shape
属性は、NumPy配列(ndarray)の形状を示すタプルを返します。このタプルは、配列の各次元の要素数を表します。
配列の形状を確認する
import numpy as np
# 1次元配列
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1.shape) # 出力: (5,)
# 2次元配列
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2.shape) # 出力: (2, 3)
# 3次元配列
arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3.shape) # 出力: (2, 2, 2)
1次元配列では、要素が5つ含まれています。shape
属性を確認すると、タプル(5,)
が返され、これは「1次元で5要素ある」ことを意味します。
2次元配列では、形状は (2, 3)
です。これは、「2行3列の配列」であることを示します。
3次元配列では、形状は (2, 2, 2)
です。これは、「2つの2×2の行列が含まれている」ことを表しています。
配列の形状を変更する
shape
属性に 直接タプルを代入する ことで、配列の形状を変更することができます。
紹介はしますが、あまりおすすめはしません。
※形状を変更するだけなら shape
属性でも可能ですが、下表の理由から、reshape()
を使うのが一般的 です!
比較項目 | shape | reshape |
元の配列を変更するか | 変更する | 変更しない(新しい配列を返す) |
元の要素数が一致しない場合 | エラーになる | エラーになる |
コピーを作成するか | しない(元の配列を直接変更) | 通常はコピーを作成する(reshape(-1) の場合はビューを返すことも) |
shapeで変更(おすすめしない)
arr = np.array([1, 2, 3, 4, 5, 6]) # 1次元配列
arr.shape = (2, 3) # 形状を (2, 3) に変更
print(arr)
# 実行結果
#[[1 2 3]
# [4 5 6]]
arr
の形が変更され、元の配列の構造が変わります。
reshapeで変更
NumPyでは、reshape()
メソッドを使うことで配列の形状(形)を変更できます。
reshape()
を使用すると、元のデータを変更せずに、新しい形状の配列を作成できます。
arr = np.array([1, 2, 3, 4, 5, 6]) # 1次元配列
reshaped_arr = arr.reshape(2, 3) # 2×3の2次元配列に変更
print(reshaped_arr)
# 実行結果
#[[1 2 3]
# [4 5 6]]
要素数6の1次元配列を reshape(2, 3)
を使って2行3列の2次元配列に変更しています
arr = np.array([[1, 2, 3], [4, 5, 6]]) # 2×3の2次元配列
flattened_arr = arr.reshape(-1) # 1次元配列に変換
print(flattened_arr)
# 実行結果
#[1 2 3 4 5 6]
reshape(-1)
を使うことで、元の形状に関係なく1次元に変換できます。
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # 3次元配列
reshaped_arr = arr.reshape(4, 2) # 2次元の形状に変更
print(reshaped_arr)
# 実行結果
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
この場合、元の3次元配列 (2, 2, 2)
を2次元 (4, 2)
に変形しています。
注意点
arr = np.array([1, 2, 3, 4, 5, 6])
arr.reshape(2, 4) # 元の要素数6と合わないのでエラー
変更後の形状の要素数は元の要素数と一致している必要があります。
arr.reshape(3, -1) # (3, ?) の ? の部分をNumPyが自動計算
-1
を使うと自動で適切な次元が計算されます。例えば、要素数6の配列に reshape(3, -1)
を指定すると、自動的に (3, 2)
になります。
shape
も同様に -1
を含むタプルを代入すると、通常の reshape(-1, ...)
と同じように動作します。
また、当たり前かもしれませんが、複数の-1
を含めると、どちらを計算すべきかわからなくなり、エラーが発生します。
arr.shape = (-1, -1) # エラー
# エラー文
ValueError: can only specify one unknown dimension
配列の次元数の確認
shapeに似た機能をもつndim
についても紹介します。ndim
を使うことで、配列の次元数を確認することができます。
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.ndim)
# 出力: 2
まとめ
最後まで読んでいただきありがとうございます。
shape
属性は、NumPy配列の形状を示すタプルを返す。- 配列の形状を変更するには
reshape()
メソッドを使用する。 - 変更後の要素数は元の要素数と一致している必要がある。
-1
を使うと自動的に適切なサイズを計算してくれる。- 配列の次元数を確認するには
ndim
属性を利用する。
形状を変更するだけなら shape
属性でも可能ですが、元の配列を保持したまま新しい形状を作りたい場合は reshape()
を使うのがおすすめです!
Python初心者におすすめの学習サービス
オンラインPython学習サービス「PyQ™(パイキュー)」:プログラミング初心者に優しいオンラインPython学習サービス。プログラミングを始めたけど、何かを作れるレベルには至っていない人におすすめ。実用的なPythonコードを実装することができる。