duankaifei的专栏

Preface

在相关聚类算法的实现过程中,用python语言实现,会经常出现array和matrix的混淆,这里做个总结。

array数组

numpy中最基本(默认)的类型是array,他的相关操作都是按元素操作的即用作数值计算当中(按元素操作有+,-,,/,*等)。相乘举例:

from numpy import *>>> a=array([1,2])>>> aarray([1, 2])>>> b=array([2,3])>>> barray([2, 3])>>> c=a*b>>> carray([2, 6])>>> dot(a,b)8

两个array的相乘*指的是对应元素的相乘;两个array的dot表示矩阵的相乘。

matrix矩阵

在numpy中的特殊类型,是作为array的子类出现,所以继承了array的所有特性并且有自己的特殊的地方,专门用来处理线性代数操作(*表示矩阵的相乘,但是对于两个matrix的除/则表示对应元素的相除。)。乘法举例如:

>>> m=mat([2,3])>>> mmatrix([[2, 3]])>>> n=([1,2])>>> n[1, 2]>>> p=m*nTraceback (most recent call last):File “<stdin>”, line 1, in <module>File “C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py”, line 341, in __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),若对齐了,则是对应元素的相乘,返回一个matrix;两个matrix的表示是两个矩阵的相乘。两个matrix的dot表示矩阵相乘。两个matrix的multiply表示对应元素的相乘。*

array和matrix的一个很难理解的点

这里会涉及到rank的概念,在线性代数(math)rank表示秩,但是必须明确的是在numpy里rank不是表示秩的概念,是表示维数的概念,,这个理解的话需要看此文章:对于多维arrays的数据结构解释:

这里暂时理解为秩,虽然这样理解是错误的,但是可以说的通一些事情。(在实际的array和matrix里,英文里介绍的关于rank就用线性代数的秩来理解,但是英文会出现dimensions等于多少等,要求matrix的dimesions必须为2,这里其实指的就是秩,dimensions才是在numpy里的真实的理解形式)

array要求秩为1(N*1,1*N等)或者大于2 matrix要求秩必须为2(rank必须为2)

下面是关于ndim和size的理解: >>> aarray([1, 2])>>> barray([[1, 2],[2, 3]])>>> cmatrix([[1, 2, 3, 4],[2, 3, 4, 5]])>>> darray([[1, 2, 3, 4],[2, 3, 4, 5]])>>> ematrix([[1, 2, 3, 4],[2, 3, 4, 5],[3, 4, 5, 6]])>>> a.size2>>> a.ndim1>>> b.size4>>> b.ndim2>>> c.size8>>> c.ndim2>>> d.size8>>> d.ndim2>>> e.ndim2>>>e.size12

这里ndim就是求的是rank,所以会发现matrix的都是2,但是array的就会存在差异,需要计算等。size返回的是元素的个数

关于dim, shape, rank, dimension and axis in numpy的细节的问题理解:

stackoverflow地址

补充

如何让

M = matrix([[1], [2], [3], [4]]) 如何转变为 array([1, 2, 3, 4])

比较优雅的办法:

>>> x=matrix(arange(12).reshape((3,4)))>>> xmatrix([[ 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的唯一缺陷就是在表示矩阵的相乘时候,要用dot,而不是*。

关于numpy里的array和matrix的其余的操作函数,另见wiki地址:

其实只要你愿意,一切都可以变得很容易。

duankaifei的专栏

相关文章:

你感兴趣的文章:

标签云: