こんにちは!インストラクターのフクロウです!
NumPyの配列は様々な計算で使うことができますが、複雑な計算になると配列の形状が分かりづらくなりますね。行列計算(特に内積や外積)では配列の形状が非常に大切なので、これを確認する方法はしっかり覚えておきたいところです。
さて、np.arrayには簡単に配列の形状を確認する事ができるインスタンス変数shapeがあります。このshapeは、配列の形を確認するだけでなく、実はnp.reshapeと似た動きをさせることもできます。
この記事でshapeについて学んで、NumPyを使った行列計算をスムーズにできるようになりましょう。
shapeの使い方
※この記事のコードは、jupyter notebookやjuputer labを使って書かれています。
コードを試すときは是非これらを使ってみてください。
# コード In [1]: import numpy as np
shapeで配列の形状を取得する
np.array(np.ndarray)のshape属性を使うと、配列の形状を確認することができます。
サンプル配列を作って試してみましょう。
# コード In [2]: a = np.arange(0,20) b = np.reshape(a, (4,5)) c = np.reshape(a, (2,2,5))
# コード In [3]: a
# 出力結果 Out [3]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
# コード In [4]: b
# 出力結果 Out [4]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]])
# コード In [5]: c
# 出力結果 Out [5]: array([[[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9]], [[10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]])
今回作った配列の型を確認しましょう。Pythonではtype関数でオブジェクトの型が確認できました。
# コード In [6]: print(type(a)) print(type(b)) print(type(c))
# 出力結果 [6]: <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>
shapeのようなインスタンス変数は、メソッドのように「インスタンス.変数名」としてアクセスすると中身が確認できます。
# コード In [7]: print(a.shape) print(b.shape) print(c.shape)
# 出力結果 [7]: (20,) (4, 5) (2, 2, 5)
reshapeのように配列の形を変える
shapeを使うことで、reshapeと同様に配列の形を変えることができます。reshapeについてはこちらの記事を御覧ください。
使い方は、「インスタンス.shape = (変更したい配列の形状)」です。
# コード In [8]: a.shape = (10,2) a
# 出力結果 Out [8]: array([[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7], [ 8, 9], [10, 11], [12, 13], [14, 15], [16, 17], [18, 19]])
# コード In [9]: a.shape
# 出力結果 Out [9]: (10, 2)
ただし、reshapeと同様に元配列の要素素に合わない形を指定するとエラーになります。注意しましょう。
配列の次元を取得するndimの使い方
shapeに似た機能をもつndimについても紹介します。ndimを使うことで、配列の次元数を確認することができます。
# コード In [11]: print(a.ndim) print(b.ndim) print(c.ndim)
# 出力結果 [11]: 2 2 3
まとめ
この記事では、NumPyのndarrayの配列の形を確認する機能、ndarray.shapeについて解説しました。
内積や外積の計算がたくさん出てくる機械学習の実装では、非常にお世話になる機能です。是非覚えて使いこなしてくださいね!