总结Numpy中matrix和ndarray的区别

区别总结的目录如下所示:

  1. 生成方式的区别

  2. matrix()和array()关于秩的区别

  3. 运算的区别

  4. 两个对象之间的相互转化

生成方式的区别

初始化特定值的矩阵,我们一般用到的方式是np.mat()或np.array()。相信使用过numpy库的学者都应该接触过这两种方法,但对于这两种方法的区别,肯定会有一些初学的小白们没细想它们。下面结合本篇主题,讲讲这两个方法的用法和区别。

  • 生成martix对象

生成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]])


  • 生成ndarray对象

该对象生成的方式很多,如np.zeros()、np.empty()、np.ones()、np.array()等等。这么多种,这里我们只讲最常用的array方法。下面是这个方法的形式,可以看到其参数不少,下面一一说明。

   array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
  1. p_object:这个必须参数对应mat的data,可以是列表和元组的任意混合嵌套、martix对象。注意,这个参数最好不要使用字符串。
  2. dtype:可选参数,数组的数据类型。
  3. copy:可选参数,对象是否需要复制。
  4. order:可选参数,创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
  5. subok:默认返回一个与基类类型一致的数组,如果p_object是一个matrix对象,且这个参数为True,则返回的还是matrix对象。
  6. ndmin:指定生成数组的最小维度,当由p_object生成的维度小于ndmin指定时,默认维度为当前指定的维度。如下所示:
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)

matrix()和array()关于秩的区别

这里先介绍两个概念:

 

  1. ndarray.ndim:数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。
  2. ndarray.shape:数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于具有n行和m列的矩阵,shape将是(n,m)。因此,shape元组的长度就是rank或维度的个数ndim。

不知道细心的你们是否发现过,在我们使用shape属性查看某个数组的形状时,有的明明只有一行数据(如[1,2,3]),但却会有不同的结果。有的是(1,3)、有的是(3,),可以发现同样的矩阵,它们的维度并不一样,这是为什么呢?

这是因为这个数组的对象不同而已,matrix对象的shape只能是二维的,而ndarray对象的shape可以是多维度的。所以对于数组[1,2,3]来说,他本可以用一个维度(3,)来表示其shape,但matrix对象的硬性要求,才使得它的shape为二维的(1,3)。

运算的区别

  • matrix 和 array 都可以通过objects后面加.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]])

  • 在做归约运算时,array的维数会发生变化,但matrix总是保持为2维。

两个对象之间的相互转化

对于两个对象之间的相互转化,在两个对象的生成中就讲过了。这里再次总结下。

  1. 从array()函数到mat()函数用np.asmatrix()或np.mat()
  2. 从mat()函数到array()函数用np.asarray()

你可能感兴趣的:(numpy)