【NumPy入門 np.matrix】行列を扱うnp.matrixクラスの特性を知ろう!

こんにちは、インストラクターのフクロウです!

この記事では行列を扱うクラスnp.matrixについて紹介します!

NumPyではnp.ndarrayクラスで配列を管理していました。

これに対して、np.ndarrayの二次元配列に当たる構造には特別にnp.matrixクラスが用意されています。

np.matrixはほとんどnp.ndarrayの二次元配列限定版といっても良いのですが、実は少し違う機能を持っています。

この記事でnp.matrixについて詳しく解説するので、是非読んでくださいね!

X3*X3.transpose()

[エラーメッセージ]

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-32-0720f2ef1dc3> in <module>()
----> 1 X3*X3.transpose()

ValueError: operands could not be broadcast together with shapes (2,3) (3,2) 

アダマール積(要素ごとの積)

配列の要素ごとの積を計算するには、np.arrayでは*演算子で可能ですが、np.matrixではできません

np.matrixではnp.multiply関数を使います。(np.araryでもnp.multiplyは使えますよ)

np.matrixのアダマール積

np.matrix同士を*演算子で計算しようとするとエラーがでます。

X*X

[エラーメッセージ]

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-34-0794a8b26aec> in <module>()
----> 1 X*X

~/anaconda3/lib/python3.7/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
    213         if isinstance(other, (N.ndarray, list, tuple)) :
    214             # This promotes 1-D vectors to row vectors
--> 215             return N.dot(self, asmatrix(other))
    216         if isscalar(other) or not hasattr(other, '__rmul__') :
    217             return N.dot(self, other)

ValueError: shapes (2,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)

アダマール積を計算するならnp.ndarray.multiply関数を使えばOKです。

np.multiply(X,X)

# 計算結果
matrix([[ 1,  4,  9],
        [16, 25, 36]])

np.arrayのアダマール積

np.ndarray同士ならば*演算子でもアダマール積が計算できます。

X3*X3

# 計算結果
array([[ 1,  4,  9],
       [16, 25, 36]])

また、np.ndarray.multiply関数ならば、np.ndarrayでもnp.matrixでも同様にアダマール積が計算できます。

np.multiply(X3,X3)

# 計算結果
array([[ 1,  4,  9],
       [16, 25, 36]])

まとめ

この記事では、NumPyで行列を扱うクラスnp.matrixの紹介と、np.ndarrayとの動作の違いについて解説しました。

np.matrixを使えば明示的に行列を扱うことができます。

行列計算はどんな機械学習モデルの実装でもよく使われるものです。

np.matrixの使い方を覚えて、是非とも効率的にプログラミングを行いましょう!

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次