Numpy中matrix和ndarray的区别

1.生成方式的区别

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

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

1.2 生成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:可选参数,数组的数据类型。 copy:可选参数,对象是否需要复制。
  3. order:可选参数,创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
  4. subok:默认返回一个与基类类型一致的数组,如果p_object是一个matrix对象,且这个参数为True,则返回的还是matrix对象。
  5. 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)

2.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对象的硬性要求,才使得它d的shape为二维的(1,3)。

3.运算的区别

3.1 运算的局限性

matrix 和 array 都可以通过objects后面加.T 得到其转置。但是 matrix objects 还可以在后面加 .H 得到共轭矩阵, 加 .I 得到逆矩阵。

3.2 矩阵乘法

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

3.3 维数变化

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

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

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

  1. 从array()函数到mat()函数用np.asmatrix()或np.mat()
  2. 从mat()函数到array()函数用np.asarray()
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青春是首不老歌丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值