numpy中的matrix和array
Preface在相干聚类算法的实现进程中,用python语言实现,会常常出现array和matrix的混淆,这里做个总结。 array数组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表示矩阵的相乘。
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表示对应元素的相乘。*
array和matrix的1个很难理解的点这里会触及到rank的概念,在线性代数(math)rank表示秩,但是必须明确的是在numpy里rank不是表示秩的概念,是表示维数的概念,这个理解的话需要看此文章:对多维arrays的数据结构解释: 这里暂时理解为秩,虽然这样理解是毛病的,但是可以说的通1些事情。(在实际的array和matrix里,英文里介绍的关于rank就用线性代数的秩来理解,但是英文会出现dimensions等于多少等,要求matrix的dimesions必须为2,这里其实指的就是秩,dimensions才是在numpy里的真实的理解情势) array要求秩为1(N*1,1*N等)或大于2
>>> a
array([1,2])
>>> b
array([[1,2],[2,3]])
>>> c
matrix([[1,2,3,4],4,5]])
>>> d
array([[1,5]])
>>> e
matrix([[1,5],[3,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地址 补充如何让
比较优雅的办法:
总结在应用中,还是用array好点,array的唯1缺点就是在表示矩阵的相乘时候,要用dot,而不是*。 关于numpy里的array和matrix的其余的操作函数,另见wiki地址:http://wiki.scipy.org/NumPy_for_Matlab_Users (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |