0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

#0177(2025/06/22)NumPyの`np.matrix` vs `np.array` + `@` 演算子

Posted at

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.matrixnp.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 の除去を検討しましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?