区别总结的目录如下所示:
生成方式的区别
matrix()和array()关于秩的区别
运算的区别
两个对象之间的相互转化
初始化特定值的矩阵,我们一般用到的方式是np.mat()或np.array()。相信使用过numpy库的学者都应该接触过这两种方法,但对于这两种方法的区别,肯定会有一些初学的小白们没细想它们。下面结合本篇主题,讲讲这两个方法的用法和区别。
生成martix对象使用的是np.mat()方法,这个方法的参数data可以是列表和元组的任意混合嵌套、字符串、ndarray对象。其中字符串每一行以分号分割,每列元素以逗号隔开。还有一点是列表和元组的任意混合嵌套深度不能大于2。
参数除了必须的data,还有一个默认参数dtype=None,关于数组的类型,我会在另一篇博客中详细例出。
mat在numpy中还有一个别名,叫做asmatrix。
In [1]: import numpy as np
In [2]: np.mat([[1,2],[5,7]])
Out[2]:
matrix([[1, 2],
[5, 7]])
In [3]: np.mat(((1,2),(5,7),(7,9)))
Out[3]:
matrix([[1, 2],
[5, 7],
[7, 9]])
In [4]: np.mat(np.array(((1,2),(5,7),(7,9))))
Out[4]:
matrix([[1, 2],
[5, 7],
[7, 9]])
In [5]: np.mat("1,2,3;4,5,6")
Out[5]:
matrix([[1, 2, 3],
[4, 5, 6]])
该对象生成的方式很多,如np.zeros()、np.empty()、np.ones()、np.array()等等。这么多种,这里我们只讲最常用的array方法。下面是这个方法的形式,可以看到其参数不少,下面一一说明。
array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
In [1]: np.array((1,2,3,4,5,6),ndmin = 5)
Out[1]: array([[[[[1, 2, 3, 4, 5, 6]]]]])
In [2]: np.array((1,2,3,4,5,6),ndmin = 5).shape
Out[2]: (1, 1, 1, 1, 6)
这里先介绍两个概念:
不知道细心的你们是否发现过,在我们使用shape属性查看某个数组的形状时,有的明明只有一行数据(如[1,2,3]),但却会有不同的结果。有的是(1,3)、有的是(3,),可以发现同样的矩阵,它们的维度并不一样,这是为什么呢?
这是因为这个数组的对象不同而已,matrix对象的shape只能是二维的,而ndarray对象的shape可以是多维度的。所以对于数组[1,2,3]来说,他本可以用一个维度(3,)来表示其shape,但matrix对象的硬性要求,才使得它的shape为二维的(1,3)。
.T
得到其转置。但是 matrix objects 还可以在后面加 .H
得到共轭矩阵, 加 .I
得到逆矩阵。matrix对象的两个矩阵相乘,是线性代数中的叉乘;而ndarray对象的两个矩阵相乘,是线性代数中的点乘。(叉乘要求第一个矩阵的列数等于第二个矩阵的行数,点乘要求两矩阵大小一样)
In [1]: a = np.mat(((1,2),(5,6)))
In [2]: b = np.mat(((0,1),(2,3)))
In [3]: a * b
Out[3]:
matrix([[ 4, 7],
[12, 23]])
In [4]: a = np.array(((1,2),(5,6)))
In [5]: b = np.array(((0,1),(2,3)))
In [6]: a * b
Out[6]:
array([[ 0, 2],
[10, 18]])
ndarray对象要想实现叉乘,要用到np.dot()方法。
In [1]: np.dot(a,b)
Out[1]:
array([[ 4, 7],
[12, 23]])
对于两个对象之间的相互转化,在两个对象的生成中就讲过了。这里再次总结下。