Numpy中matrix和ndarray的区别

Numpy中matrix和ndarray的区别文章目录 1 生成方式的区别 1 1 生成 martix 对象 1 2 生成 ndarray 对象 2 matrix 和 array 关于秩的区别 3 运算的区别 3 1 运算的局限性 3 2 矩阵乘法 3 3 维数变化 4 两个对象

大家好,欢迎来到IT知识分享网。

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/131058.html

(0)
上一篇 2025-08-10 19:26
下一篇 2025-08-10 19:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信