总结Numpy中matrix和ndarray的区别

    xiaoxiao2023-11-24  165

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

    生成方式的区别

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

    运算的区别

    两个对象之间的相互转化

    生成方式的区别

    初始化特定值的矩阵,我们一般用到的方式是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) p_object:这个必须参数对应mat的data,可以是列表和元组的任意混合嵌套、martix对象。注意,这个参数最好不要使用字符串。dtype:可选参数,数组的数据类型。copy:可选参数,对象是否需要复制。order:可选参数,创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)subok:默认返回一个与基类类型一致的数组,如果p_object是一个matrix对象,且这个参数为True,则返回的还是matrix对象。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()关于秩的区别

    这里先介绍两个概念:

     

    ndarray.ndim:数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。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维。

    两个对象之间的相互转化

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

    从array()函数到mat()函数用np.asmatrix()或np.mat()从mat()函数到array()函数用np.asarray()
    最新回复(0)