numpyにおけるarrayタイプとmatrixタイプの詳細
numpyにおけるarrayタイプとmatrixタイプの詳細
Numpyの2つの重要なタイプarrayタイプ(N次元配列ndarray)とマトリクスタイプmatrixは多くのNumpy数値計算に基づく基礎であるため、両者の関係を明らかにすることはかなり重要で、特にプログラムにはこの2つのタイプが混ざっていて、いくつかの加減乗除の演算を挟んでいて、それはまるで理不尽な感じがして、時々頭が飛び出して一言:ニマ、プログラムはまた言うことを聞かない!
まず、Numpyの中で最も重要なデータ構造はndarryであり、arrayと略記されている.すなわち、N次元配列であり、matrixもarrayである.次元数が2の特殊なarrayにすぎない.matrixの次元数は固定されている.これは一般のarrayとは著しく異なり、様々な演算を減算してもmatrixの次元数は変化しないが、arrayは演算時、特に帰約時に次元数が変化する.一言で言えば、matrixの次元数は永遠に2.
まず両者の間の転化、array回転matrix用np.asmatrixまたはnp.matrix,matrix回転array用np.asarrayまたはmatrixのA属性
行ベクトルまたは列ベクトルに対応するarrayとmatrixの実際の次元数を見てみましょう
arrayの1次元が多次元になり、多次元が1次元になるのを見てみましょう.1 Dを多次元に変換するreshape
arrayの多くの関数(ufunc)演算は要素レベルであり、すなわち関数はarrayの各要素に対して処理され、matrixではマトリクスの定義に基づいて全体的に処理される.
AとBの行列式をarrayで乗算するにはnpを用いる.dot(A,B)またはA.dot(B)は、AとBの両方に対して1次元のベクトルをマトリクス式に乗算し、最後に得られる数である
matrixの加減算は,マトリクスの定義に従って行われるが,もちろん演算結果は2次元である.
matrixはravel関数を適用して得られたものは依然としてmatrixであり,形状は1であった.×N
トランスフォームの場合、arrayとmatrixはtranspose関数を使用できます.matrixはT属性を直接使用することもできます.
まとめ:matrixが2次元であることを認識し、あなたが使用しているarrayが何次元であるかを明らかにしなければなりません.マトリクス演算を行うとき、マトリクス演算の各次元の要求を満たすかどうか、満たさなければ、どのように速く変換すべきかを明らかにしなければなりません.
Numpyの2つの重要なタイプarrayタイプ(N次元配列ndarray)とマトリクスタイプmatrixは多くのNumpy数値計算に基づく基礎であるため、両者の関係を明らかにすることはかなり重要で、特にプログラムにはこの2つのタイプが混ざっていて、いくつかの加減乗除の演算を挟んでいて、それはまるで理不尽な感じがして、時々頭が飛び出して一言:ニマ、プログラムはまた言うことを聞かない!
まず、Numpyの中で最も重要なデータ構造はndarryであり、arrayと略記されている.すなわち、N次元配列であり、matrixもarrayである.次元数が2の特殊なarrayにすぎない.matrixの次元数は固定されている.これは一般のarrayとは著しく異なり、様々な演算を減算してもmatrixの次元数は変化しないが、arrayは演算時、特に帰約時に次元数が変化する.一言で言えば、matrixの次元数は永遠に2.
まず両者の間の転化、array回転matrix用np.asmatrixまたはnp.matrix,matrix回転array用np.asarrayまたはmatrixのA属性
行ベクトルまたは列ベクトルに対応するarrayとmatrixの実際の次元数を見てみましょう
>>> a = np.array([1, 2, 3, 4, 5])
>>>> a
array([1, 2, 3, 4, 5])
>>> print(a.shape) # 1 , a array
(5L,)
>>> b = np.array([[1, 2, 3, 4, 5]]) # b = a.reshape(1,5)
>>> print(b);print(b.shape)
[[1 2 3 4 5]] # b ,shape=(1,5)
(1L, 5L)
>>> c = np.array([[1], [2], [3], [4], [5]]) # c = a.reshape(5,1)
>>> print(c);print(c.shape) # c ,shape=(5,1)
[[1]
[2]
[3]
[4]
[5]]
(5L, 1L)
arrayの1次元が多次元になり、多次元が1次元になるのを見てみましょう.1 Dを多次元に変換するreshape
>>> a = np.arange(12)
>>> print(a);print(a.shape)
[ 0 1 2 3 4 5 6 7 8 9 10 11]
(12L,)
>>> b = a.reshape(3, 4);print(b);print(b.shape) #
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
(3L, 4L)
>>> c = a.reshape(2, 2, 3);print(c);print(c.shape) #
[[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
(2L, 2L, 3L)
>>> d = c.ravel();print(d);print(d.shape) # , ravel , matrix , matrix ( shape 2), matrix M×N 1×K(K M N )
[ 0 1 2 3 4 5 6 7 8 9 10 11]
(12L,)
arrayの多くの関数(ufunc)演算は要素レベルであり、すなわち関数はarrayの各要素に対して処理され、matrixではマトリクスの定義に基づいて全体的に処理される.
>>> a = np.array([1, 2, 3])
>>> b = np.array([4, 5, 6])
>>> c = a + b;print(c) #
[5 7 9]
>>> d = a - b;print(d) #
[-3 -3 -3]
>>> e = a * b;print(e) #
[ 4 10 18]
>>> f = a**2;print(f) #
[1 4 9]
AとBの行列式をarrayで乗算するにはnpを用いる.dot(A,B)またはA.dot(B)は、AとBの両方に対して1次元のベクトルをマトリクス式に乗算し、最後に得られる数である
>>> a = np.array([1, 2, 3])
>>> b = np.array([1, 2, 3])
>>> c = a.dot(b);print(c);print(c.shape);print(type(c))
14
() # , array, shape
'numpy.int32'>
>>> d = b.dot(a);print(d) # d c
14
# , A(m×n) B(p×q) , np.dot(A,B) , n p
>>> a = np.array([[1, 2, 3], [1, 1, 1]]);b = np.array([1, 2, 3]);print(a.shape);
print(b.shape);c = a.dot(b);print(c);print(c.shape)
(2L, 3L)
(3L,)
[14 6]
(2L,)
>>> a = np.array([[1, 2, 3], [1, 1, 1]]);b = np.array([[1, 1], [2, 2] ,[3, 3]]);
print(a.shape);print(b.shape);c = a.dot(b);print(c);print(c.shape)
(2L, 3L)
(3L, 2L)
[[14 14]
[ 6 6]]
(2L, 2L)
matrixの加減算は,マトリクスの定義に従って行われるが,もちろん演算結果は2次元である.
>>> a = np.mat([[1, 2, 3], [4, 5, 6]]);print(a);print(a.shape)
[[1 2 3]
[4 5 6]]
(2L, 3L)
>>> b = np.mat([[4, 5, 6], [7, 8, 9]]);print(b);print(b.shape)
[[4 5 6]
[7 8 9]]
(2L, 3L)
>>> c = a + b;print(c);print(c.shape) #
[[ 5 7 9]
[11 13 15]]
(2L, 3L)
>>> c = a - b;print(c);print(c.shape) #
[[-3 -3 -3]
[-3 -3 -3]]
(2L, 3L)
>>> d = np.matrix([[1, 4], [2, 5], [3, 6]]);print(d);print(d.shape)
[[1 4]
[2 5]
[3 6]]
(3L, 2L)
>>> e = a * d;print(e);print(e.shape) #
[[14 32]
[32 77]]
(2L, 2L)
>>> f = np.matrix([[1, 2], [3, 4]]);g = f**2;print(f);print(g) # g = f * f
[[1 2]
[3 4]]
[[ 7 10]
[15 22]]
matrixはravel関数を適用して得られたものは依然としてmatrixであり,形状は1であった.×N
>>> print(g.ravel());print(g.shape)
[[ 7 10 15 22]]
(1L, 4L)
# array, A1
>>> i = g.A1;print(i);print(i.shape)
[ 7 10 15 22]
(4L,)
トランスフォームの場合、arrayとmatrixはtranspose関数を使用できます.matrixはT属性を直接使用することもできます.
>>> a = np.arange(6).reshape(2, 3)
>>> a
array([[0, 1, 2],
[3, 4, 5]])
>>> print(a.transpose())
[[0 3]
[1 4]
[2 5]]
>>> b = np.matrix(a)
>>> b
matrix([[0, 1, 2],
[3, 4, 5]])
>>> b.transpose()
matrix([[0, 3],
[1, 4],
[2, 5]])
# array, , transpose
>>> a = np.array([1, 2, 3, 4]);print(a.shape)
(4L,)
>>> a
array([1, 2, 3, 4])
>>> b = a.transpose();print(b.shape)
(4L,)
>>> b
array([1, 2, 3, 4])
まとめ:matrixが2次元であることを認識し、あなたが使用しているarrayが何次元であるかを明らかにしなければなりません.マトリクス演算を行うとき、マトリクス演算の各次元の要求を満たすかどうか、満たさなければ、どのように速く変換すべきかを明らかにしなければなりません.