在相干聚類算法的實現進程中,用python語言實現,會常常出現array和matrix的混淆,這里做個總結。
numpy中最基本(默許)的類型是array,他的相干操作都是按元素操作的即用作數值計算當中(按元素操作有+,-,,/,*等)。相乘舉例:
from numpy import *
>>> a=array([1,2])
>>> a
array([1, 2])
>>> b=array([2,3])
>>> b
array([2, 3])
>>> c=a*b
>>> c
array([2, 6])
>>> dot(a,b)
8
兩個array的相乘*指的是對應元素的相乘;兩個array的dot表示矩陣的相乘。
把array轉換為matrix用asmatrix()
多數numpy函數返回的是array類型,不是matrix類型。
在numpy中的特殊類型,是作為array的子類出現,所以繼承了array的所有特性并且有自己的特殊的地方,專門用來處理線性代數操作(*表示矩陣的相乘,但是對兩個matrix的除/則表示對應元素的相除。)。乘法舉例如:
>>> m=mat([2,3])
>>> m
matrix([[2, 3]])
>>> n=([1,2])
>>> n
[1, 2]
>>> p=m*n
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:Python27libsite-packages
umpymatrixlibdefmatrix.py", line 341, i
n __mul__
return N.dot(self, asmatrix(other))
ValueError: objects are not aligned
>>> dot(m,n)
matrix([[8]])
>>> multiply(m,n)
matrix([[2,6]])
* 兩個matrix相乘毛病緣由是m的列不等于n的行,也即不對齊(aligned),若對齊了,則是對應元素的相乘,返回1個matrix;兩個matrix的表示是兩個矩陣的相乘。兩個matrix的dot表示矩陣相乘。兩個matrix的multiply表示對應元素的相乘。*
這里會觸及到rank的概念,在線性代數(math)rank表示秩,但是必須明確的是在numpy里rank不是表示秩的概念,是表示維數的概念,這個理解的話需要看此文章:對多維arrays的數據結構解釋:
多維arrays數據結構理解
這里暫時理解為秩,雖然這樣理解是毛病的,但是可以說的通1些事情。(在實際的array和matrix里,英文里介紹的關于rank就用線性代數的秩來理解,但是英文會出現dimensions等于多少等,要求matrix的dimesions必須為2,這里其實指的就是秩,dimensions才是在numpy里的真實的理解情勢)
array要求秩為1(N*1,1*N等)或大于2
matrix要求秩必須為2(rank必須為2)
>>> a
array([1, 2])
>>> b
array([[1, 2],
[2, 3]])
>>> c
matrix([[1, 2, 3, 4],
[2, 3, 4, 5]])
>>> d
array([[1, 2, 3, 4],
[2, 3, 4, 5]])
>>> e
matrix([[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]])
>>> a.size
2
>>> a.ndim
1
>>> b.size
4
>>> b.ndim
2
>>> c.size
8
>>> c.ndim
2
>>> d.size
8
>>> d.ndim
2
>>> e.ndim
2
>>>e.size
12
這里ndim就是求的是rank,所以會發現matrix的都是2,但是array的就會存在差異,需要計算等。size返回的是元素的個數
stackoverflow地址
如何讓
M = matrix([[1], [2], [3], [4]])
如何轉變成
array([1, 2, 3, 4])
比較優雅的辦法:
>>> x=matrix(arange(12).reshape((3,4)))
>>> x
matrix([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> x.getA1()
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
在應用中,還是用array好點,array的唯1缺點就是在表示矩陣的相乘時候,要用dot,而不是*。
關于numpy里的array和matrix的其余的操作函數,另見wiki地址:http://wiki.scipy.org/NumPy_for_Matlab_Users