NumPyのnp.matrix
vs np.array
+ @
演算子
1. はじめに
NumPyには2種類の行列表現があります:
-
np.matrix
クラス -
np.array
クラス(と@
演算子による行列積)
どちらも行列演算を扱うことができますが、設計思想や振る舞いには大きな違いがあります。
本記事では、Python中上級者や科学技術計算、機械学習に携わるエンジニア向けに、これらの違いを詳しく掘り下げ、設計判断に資する知識を提供します。
2. 結論(先に要点を知りたい人へ)
比較軸 | np.matrix |
np.array + @
|
---|---|---|
推奨度 | 非推奨(将来的に廃止予定) | 推奨 |
挙動 | 2次元固定(常に2次元) | 任意次元 |
* 演算子 |
行列積 | 要素積 |
@ 演算子 |
非対応(未定義) | 行列積 |
可読性 | 高(MATLAB風) | Pythonic |
拡張性 | 低い(2D限定) | 高い(テンソル対応) |
実務利用 | 古いコードベースに残る | 現代的な実装では主流 |
3. 基本の違い
3.1 np.matrix
の特徴
import numpy as np
A = np.matrix([[1, 2], [3, 4]])
- 常に2次元
-
*
演算子が行列積(線形代数に便利) - 転置
.T
、逆行列.I
、行列式.det()
などが属性で簡単に呼べる
A.T # 転置
A.I # 逆行列
A * A # 行列積(@ と同じ)
3.2 np.array
の特徴
B = np.array([[1, 2], [3, 4]])
- 任意次元(1D, 2D, 3D...)
-
*
演算子は要素積 - 行列積は
@
演算子かnp.dot
,np.matmul
で明示的に指定
B * B # 要素ごとの積
B @ B # 行列積(Python 3.5+)
4. APIレベルでの違い
4.1 計算結果の次元性
np.array([[1,2]]) * np.array([[1],[2]])
# => エラー、あるいはブロードキャストによる意図外の結果
np.matrix([[1,2]]) * np.matrix([[1],[2]])
# => [[5]](内積)
4.2 転置と逆行列
A = np.matrix([[1,2],[3,4]])
A.T # 転置(属性)
A.I # 逆行列(属性)
B = np.array([[1,2],[3,4]])
B.T # 転置(属性)
np.linalg.inv(B) # 逆行列(関数)
4.3 ブロードキャストの扱い
-
np.matrix
ではブロードキャストが制限される -
np.array
はブロードキャストを柔軟に使える
5. 実行速度の違い
一般的に、np.matrix
は内部的に np.array
に依存しており、速度面での優位性はありません。
むしろ np.array
を使い @
や np.matmul()
によって明示的に操作したほうが高速化の余地があります。
# 比較コード
import numpy as np
import time
A1 = np.matrix(np.random.rand(1000, 1000))
A2 = np.array(A1)
# matrix * matrix
start = time.time()
A1 * A1
print("matrix:", time.time() - start)
# array @ array
start = time.time()
A2 @ A2
print("array:", time.time() - start)
結果:差は僅少だが、最適化の自由度は np.array
のほうが高い
6. 混在利用によるトラブル
np.matrix
と np.array
の混在はバグの温床になります。
A = np.matrix([[1, 2], [3, 4]])
B = np.array([[1, 2], [3, 4]])
A * B # 意図外の挙動になる可能性あり
NumPy公式も、明示的に np.matrix
を廃止方向としています。
7. 今後の互換性と非推奨化
NumPy公式ドキュメントより:
The use of
np.matrix
is discouraged, and it may be removed in future versions.
推奨される代替方法:
-
np.array
+@
-
np.linalg
モジュールでの線形代数 -
scipy.linalg
の活用
8. まとめ:使い分け早見表
利用目的 | 推奨手法 |
---|---|
1次元〜多次元テンソル計算 | np.array |
ブロードキャストを使いたい | np.array |
行列積、転置、逆行列など線形代数 |
np.array + @ , .T , np.linalg.inv()
|
可読性重視の個人コード(短期) |
np.matrix も可(ただし推奨されない) |
9. 終わりに
一見便利に見える np.matrix
ですが、Pythonのエコシステム(特に機械学習・データ解析・数値計算)ではすでに時代遅れの選択肢になっています。
新規開発では 常に np.array
と @
を基本とする設計 が推奨されます。
一貫性と将来性を考え、コードベースの移行やリファクタリングのタイミングで np.matrix
の除去を検討しましょう。