numpyの行列は numpyのながら、厳密に2次元である配列(ndarrays)はN次元です。Matrixオブジェクトはndarrayのサブクラスであるため、ndarrayのすべての属性とメソッドを継承します。
numpy行列の主な利点は、行列乗算の便利な表記法を提供することです。aとbが行列の場合、a*b
それらは行列の積です。
import numpy as np
a = np.mat('4 3; 2 1')
b = np.mat('1 2; 3 4')
print(a)
# [[4 3]
# [2 1]]
print(b)
# [[1 2]
# [3 4]]
print(a*b)
# [[13 20]
# [ 5 8]]
一方、Python 3.5以降では、NumPyは@
演算子を使用した中置行列乗算をサポートしているため、Python> = 3.5でndarrayを使用して行列乗算と同じ便利さを実現できます。
import numpy as np
a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
# [ 5 8]]
行列オブジェクトとndarrayはどちらも.T
転置を返す必要がありますが、行列オブジェクト.H
は共役転置と.I
その逆も必要です。
対照的に、numpy配列は、操作が要素ごとに適用されるという規則(一貫してnew @
演算子を除く)に従います。したがって、a
とb
numpy配列の場合、a*b
要素ごとに要素を乗算することによって形成される配列になります。
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
行列の乗算の結果を取得するには、次のコードを使用しますnp.dot
(または@
上記のようにPython 3.5以上の場合)。
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
**
また、オペレータは、動作が異なります:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
a
は行列なのでa**2
、行列の積を返しますa*a
。ためc
ndarrayあり、c**2
各成分の二乗要素単位でndarrayを返します。
マトリックスオブジェクトとndarrayの間には、他にも技術的な違いがあります(np.ravel
、項目の選択、シーケンスの動作に関係しています)。
numpy配列の主な利点は、2次元行列よりも一般的であることです。3次元配列が必要な場合はどうなりますか?次に、行列オブジェクトではなく、ndarrayを使用する必要があります。したがって、行列オブジェクトの使用法を学ぶことはより手間がかかります。行列オブジェクトの操作とndarray操作を学ぶ必要があります。
乗算が予期しないものを返さないようにするには、変数がどのタイプのオブジェクトであるかを追跡する必要があるため、行列と配列の両方を混合するプログラムを作成すると、生活が困難になります。
対照的に、ndarrayのみを使用する場合は、わずかに異なる関数/表記を除いて、マトリックスオブジェクトで実行できるすべてのことを実行できます。
NumPy行列の製品表記法(Python> = 3.5のndarraysでほぼエレガントに実現できる)の視覚的な魅力を放棄するつもりなら、NumPy配列は間違いなく進むべき道だと思います。
PS。もちろん、あなたが本当に以来、他を犠牲にしていずれかを選択する必要はありませんnp.asmatrix
し、np.asarray
(配列が2次元である限り)あなたは一方を他方に変換することができます。
numpyの間の相違点の概要があるarrays
numpyのの対matrix
ES ここでは。