shapeはNumPy配列(ndarray)の属性の1つで配列の形状を保持しています。ここでは、shape属性の確認と変更の方法を解説していきます。
1. shapeで配列の形状を確認/変更
shapeはndarrayの配列の形状を保持しています。これを参照するには、以下のようにndarray.shapeと書きます。
なお、shapeは正確にはnumpy.ndarrayクラスのインスタンス変数です。クラスやインスタンス変数については、『【Python】オブジェクト指向プログラミングの概念と書き方』や『Pythonでのクラス(class)の使い方』で解説していますので、目を通してみてください。
書き方:
ndarray.shape
一緒に確認したい属性と関数:
- ndarray.size: 配列の要素数を保持する属性
- ndarray.dtype: 配列のデータ型を保持する属性
- numpy.reshape: 配列の形状を変換(関数)。
- ndarray.reshape: 配列の形状を変換(メソッド)。
shapeは、主に配列の現在の形状を取得するために使われますが、配列の形状を変換することにも使うことができます。
早速、実際のコードで確認していきましょう。
1.1. 配列の形状を取得する
shapeは、配列の形状をタプルで保持しています。
例えば、以下のコードでは、まず、3つの要素を持つ1次元配列arr1を生成しています。そして、「arr1.shape」で属性を参照すると(3,)と表示されます。1次元配列は軸が列の1つだけなので、これは列の要素数を表します。
''' 1次元配列のshape属性の値 '''
arr1 = np.array((1, 2, 3))
print(arr1)
print(arr1.shape)
念のためshape属性のデータ型を確認しておきましょう。以下のようにタプル型であることがわかります。
''' shape属性の値はタプル型です。 '''
type(arr1.shape)
次に2次元配列の場合を見てみましょう。
2次元配列のshape属性は、(行, 列)のタプル型のデータです。以下のコードでは、2行3列の2次元配列を生成しているので、shape属性は(2, 3)です。
''' 2次元配列のshape属性の値 '''
arr2 = np.arange(6).reshape(2, 3)
print(arr2, '\n')
print(arr2.shape)
3次元配列の場合は、(奥行き, 行, 列)のタプルでデータを保持しています。以下のコードでは、奥行き2で、2行3列の配列を生成しているので、shape属性は(2, 2, 3)です。
''' 3次元配列のshape属性の値 '''
arr3 = np.arange(12).reshape(2, 2, 3)
print(arr3, '\n')
print(arr3.shape)
1.2. 配列の形状を変換する
このように、shapeプロパティは、主に配列の現在の形状を取得するために使われますが、これで配列の形状を変換することもできます。
早速、確認していきましょう。
まずは、以下の1次元配列を生成します。
import numpy as np
# 1次元配列を生成
arr1 = np.arange(12)
print(arr1)
この配列を、shapeプロパティで形状変換するには、「=」演算子で、新しい形状をタプルで渡します。
以下のコードでは2次元配列に変換しています。
# arr1を2次元配列に変換
arr1.shape = (2, 6)
print(arr1)
3次元配列以上にも変換することができます。
# arr1を3次元配列に変換
arr1.shape = (2, 2, 3)
print(arr1)
また「-1」を指定した軸の要素数は、自動で計算してくれます。
# reshape()と同様に-1指定で自動計算
arr1.shape = (-1, 4)
print(arr1)
ただし、配列の元々の要素数と、新しく指定する形状が合わない場合はエラーになります。
# 要素数と合わない形状変換は不可
arr1.shape = (2, 4)
1.3. ndarrayの属性についての補足
shapeプロパティの使い方に関しては、以上の通りです。
ここからは知識的な補足として、NumPy配列(ndarray)の属性について簡潔に解説しておきたいと思います。
なお解説にあたって、オブジェクト指向プログラミングに不慣れな方は、『Pythonのオブジェクト指向プログラミングの概念と書き方』も一緒にご覧ください。
もし、初めてオブジェクト指向プログラミングに触れるという場合は、最初から全て理解しようとしなくても大丈夫です。NumPy配列の扱いに慣れてきたところで読み返してみると、より理解できるようになっているはずです。
ndarrayは、以下のコードで確認できるように、「numpy.ndarray」クラスです。
import numpy as np
''' ndarrayはnumpy.ndarrayクラスのインスタンスです。 '''
# 配列の作成
arr = np.arange(4)
# 作成した配列(インスタンス)の出力
print('arr:', arr)
# 作成した配列のクラスの確認
print('arrのクラスの確認:', type(arr))
そして、生成したndarrayはnumpy.ndarrayクラスのインスタンスです。インスタンスはインスタンス変数を持ちます。ndarrayの属性とは、このインスタンス変数のことです。
オブジェクト指向プログラミングでは、インスタンス変数は、「インスタンス.プロパティ」で取得することができます。
''' インスタンスはインスタンス変数を持ちます。 '''
# インスタンス変数shape
print('shape: ', arr.shape)
# インスタンス変数ndim
print('ndim: ', arr.ndim)
# インスタンス変数dtype
print('dtype:', arr.dtype)
このようにndarrayの「属性」とは、インスタンス変数のことです。
知っている人にとっては当たり前すぎることかもしれませんが、プログラミング初心者の方は、ぜひ覚えていてください。
2. まとめ
以上。NumPyのshape属性は、配列の形状を保持しているインスタンス変数です。これを使うと、配列の形状を確認することができますし、変更することもできます。
コメント