numpy docs では、行列を操作するために行列の代わりに配列を使用することをお勧めします。ただし、オクターブ (最近まで使用していた) とは異なり、* は行列の乗算を実行しないため、関数 matrixmultipy() を使用する必要があります。これにより、コードが非常に読みにくくなっていると思います。
誰かが私の意見を共有し、解決策を見つけましたか?
numpy docs では、行列を操作するために行列の代わりに配列を使用することをお勧めします。ただし、オクターブ (最近まで使用していた) とは異なり、* は行列の乗算を実行しないため、関数 matrixmultipy() を使用する必要があります。これにより、コードが非常に読みにくくなっていると思います。
誰かが私の意見を共有し、解決策を見つけましたか?
クラスの使用を避ける主な理由matrix
は、a)本質的に2次元であり、b)「通常の」numpy配列と比較して追加のオーバーヘッドがあることです。線形代数だけをしているのなら、ぜひ、行列クラスを自由に使ってください...個人的には、それが価値があるよりも厄介だと思います。
配列(Python 3.5より前)の場合は、dot
の代わりにを使用しmatrixmultiply
ます。
例えば
import numpy as np
x = np.arange(9).reshape((3,3))
y = np.arange(3)
print np.dot(x,y)
または、numpyの新しいバージョンでは、単に使用しますx.dot(y)
*
個人的には、行列の乗算を意味 する演算子よりもはるかに読みやすいと思います...
Python 3.5の配列の場合は、を使用しますx @ y
。
3.5 で、Python はついに行列乗算演算子を取得しました。構文はa @ b
.
行列を扱う場合と同様に配列を扱う場合、ドット演算子が異なる答えを与える状況があります。たとえば、次のように仮定します。
>>> a=numpy.array([1, 2, 3])
>>> b=numpy.array([1, 2, 3])
それらを行列に変換しましょう:
>>> am=numpy.mat(a)
>>> bm=numpy.mat(b)
これで、2 つのケースで異なる出力が表示されます。
>>> print numpy.dot(a.T, b)
14
>>> print am.T*bm
[[1. 2. 3.]
[2. 4. 6.]
[3. 6. 9.]]
http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.htmlからの参照
...、numpy.matrixクラスの使用はお勧めできません。これは、2D numpy.ndarrayオブジェクトでは達成できないことを何も追加せず、どのクラスが使用されているかについて混乱を招く可能性があるためです。例えば、
>>> import numpy as np
>>> from scipy import linalg
>>> A = np.array([[1,2],[3,4]])
>>> A
array([[1, 2],
[3, 4]])
>>> linalg.inv(A)
array([[-2. , 1. ],
[ 1.5, -0.5]])
>>> b = np.array([[5,6]]) #2D array
>>> b
array([[5, 6]])
>>> b.T
array([[5],
[6]])
>>> A*b #not matrix multiplication!
array([[ 5, 12],
[15, 24]])
>>> A.dot(b.T) #matrix multiplication
array([[17],
[39]])
>>> b = np.array([5,6]) #1D array
>>> b
array([5, 6])
>>> b.T #not matrix transpose!
array([5, 6])
>>> A.dot(b) #does not matter for multiplication
array([17, 39])
scipy.linalg操作は、 numpy.matrixまたは 2D numpy.ndarrayオブジェクトに等しく適用できます。
このトリックは、あなたが探しているものかもしれません。これは一種の単純な演算子のオーバーロードです。
次に、次のような提案された Infix クラスのようなものを使用できます。
a = np.random.rand(3,4)
b = np.random.rand(4,3)
x = Infix(lambda x,y: np.dot(x,y))
c = a |x| b
PEP 465からの適切な引用- @petr-viktorin で言及されているように、マトリックス乗算専用の中置演算子は、OP が直面していた問題を明確にします。
__mul__
[...] numpy は、異なるメソッドを持つ 2 つの異なる型を提供します。numpy.ndarray
オブジェクトの場合、要素*
ごとの乗算を実行し、行列の乗算では関数呼び出し (numpy.dot
) を使用する必要があります。numpy.matrix
オブジェクトの場合、行列*
の乗算を実行し、要素ごとの乗算には関数構文が必要です。を使用してコードを書くnumpy.ndarray
とうまくいきます。を使用したコードの記述numpy.matrix
も正常に機能します。しかし、これら 2 つのコードを統合しようとするとすぐに問題が発生します。を期待してndarray
を取得するコードmatrix
、またはその逆のコードは、クラッシュするか、誤った結果を返す可能性があります
中置演算子の導入は、@
Python マトリックス コードの統一と簡素化に役立つはずです。