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の実際の次元数を見てみましょう
>>> 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が何次元であるかを明らかにしなければなりません.マトリクス演算を行うとき、マトリクス演算の各次元の要求を満たすかどうか、満たさなければ、どのように速く変換すべきかを明らかにしなければなりません.