クロの制作日記

クロの制作日記

田舎の大学生がUnityとか機械学習関連の制作物をひたすらアップします。ブログで紹介したコード一覧https://github.com/kuroshum/blog_code

numpy.linalg.LinAlgError: Last 2 dimensions of the array must be squareが起きる理由

研究室の後輩向けにpythonを用いた機械学習の講習を行っていたときに上記のエラーが起きたので、対処方法をエラー原因ごとに紹介します。




逆行列を計算しようとした場合

大抵の場合はこちらです。

これはnp.linalg.inv()を用いたときに起きるエラーで、対象の行列が正方行列でないのが原因です。

以下のコードは正方行列なので実行できます

import numpy

array = np.array([[1,2],[2,3]])
array_inv = np.linalg.inv(array)
print(array_inv)

以下のコードは正方行列でないので実行できません

import numpy

array = np.array([[1,2,3],[2,3,4]])
array_inv = np.linalg.inv(array)
print(array_inv)

解決方法

こういう時は、一般逆行列を計算するnp.linalg.pinv()を使用しましょう

import numpy

array = np.array([[1,2,3],[2,3,4]])
array_inv = np.linalg.pinv(array)
print(array_inv)

疑似逆行列ともいうようですが、これを計算すれば正方行列じゃない場合やランク落ちしてしまう場合でも逆行列(実際はもっともらしい値)を求めることができます。

また、もう少し簡単な方法で、小さな値を掛けた単位行列を足すという手法もあります。詳しい説明は以下の記事を参考にしてください。
kurora-shumpei.hatenablog.com

「pow()」や「**」で乗数を計算しようとした場合

逆行列を計算していない場合でも上記のエラーが出る場合もあります。

私の後輩はこのパターンで、ある行列の2乗を計算しようとしたときに、このエラーが出てきて混乱しました。

import numpy

array = np.matrix([[1,2,3],[2,3,4]])
array = pow(array,2)
print(array)

これは行列のデータ型が「numpy.ndarray」ではなく「numpy.matrix」になっているのが原因です。

なぜ、ndarrayなら大丈夫でmatrixならダメなのかはよくわかりませんが、内部で何かしらの仕様があるのでしょう

解決方法

こういうときは、np.ndarrayに変換するかnp.power()を使用しましょう。

import numpy

array = np.matrix([[1,2,3],[2,3,4]])
array = np.array(array)
array = pow(array,2)
print(array)
import numpy

array = np.array([[1,2,3],[2,3,4]])
array = np.power(array,2)
print(array)

基本的にnumpy.arrayを使えば差し支えすることはないので、numpy.ndarrayに変換するのが良いかと思います。