3.1. 行列演算

3.1.1. numpy.matrixは使わない

行列演算には numpy.ndarray というNumPyの通常の配列クラスを使う方法と numpy.matrix という行列専用のクラスを使う方法があります。 しかし、numpy.matrixの 公式ドキュメント によると、numpy.matrixを使う方法は現在では推奨されていません(将来廃止されます):

It is no longer recommended to use this class, even for linear algebra. Instead use regular arrays. The class may be removed in the future.

web検索をするとmatrixクラスを使った方法を紹介しているページが引っかかることがありますが、古い情報ですので気を付けてください。 公式ドキュメントを参照することの重要性が分かる例です。

3.1.2. 行列演算には専用の関数を使う

NumPy配列の演算には可能な限り専用の関数を使いましょう。 全ての関数や機能は NumPy Reference に載っています。 この中から、重要な項目の一例を挙げると

があります。

行列演算には、ひとつめの Linear algebra (numpy.linalg) を使います。 例えば、行列・行列積や行列・ベクトル積にはnumpy.matmul関数(numpy.dotも使えますがnumpy.matmulが推奨されています), ベクトル同士の内積にはnumpy.inner関数を使います。 その他、numpy.einsum関数というアインシュタインの縮約記法を実行する高度な関数まで用意されています(覚えるととても便利です)。 また、対角化などの高度な関数はnumpy.linalgサブモジュールとしてまとまっています。 どのような関数があるのか、一度、一覧に目を通しておくとよいでしょう。

3.1.3. numpy.linalg vs scipy.linalg

行列関連の関数は numpy.linalgscipy.linalg にあり、どちらを使えばいいのか悩むところです。 どちらも内部でBLASやLAPACKを使っているようなので、速度的には大差はなさそうです(web検索すると検証した記事がちらほら見つかりますが結論は様々です)。

SciPyの チュートリアル には

scipy.linalg contains all the functions in numpy.linalg. plus some other more advanced ones not contained in numpy.linalg.

Another advantage of using scipy.linalg over numpy.linalg is that it is always compiled with BLAS/LAPACK support, while for numpy this is optional. Therefore, the scipy version might be faster depending on how numpy was installed.

Therefore, unless you don’t want to add scipy as a dependency to your numpy program, use scipy.linalg instead of numpy.linalg.

と書かれていますが、SciPy側の意見なのでこれを参考にするのは平等性に欠ける気がします。 ただし、SciPyの方が関数が充実しているのは事実です。

全てSciPyで統一するという方針でもいいですし、 NumPyにも含まれている基本的な演算はNumPyで行ってSciPyにしかない高度な演算はSciPyで行うという方針でも構いません。