为了账号安全,请及时绑定邮箱和手机立即绑定

numpy数组和矩阵之间有什么区别?我该用哪一个?

numpy数组和矩阵之间有什么区别?我该用哪一个?

慕妹3242003 2019-07-06 13:10:39
numpy数组和矩阵之间有什么区别?我该用哪一个?每种方法的优点和缺点是什么?据我所见,如果需要的话,两种方法都可以替代另一种,所以我应该同时使用这两种,还是应该只使用其中一种呢?节目的风格会影响我的选择吗?我正在用numpy做一些机器学习,所以确实有很多矩阵,但也有很多向量(数组)。
查看完整描述

3 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

Numpy矩阵严格是二维的,而numpy阵列(Ndarray)是N维的.矩阵对象是ndarray的子类,因此它们继承了ndarray的所有属性和方法。

numpy矩阵的主要优点是它们为矩阵乘法提供了一种方便的表示法:如果a和b是矩阵,那么a*b就是它们的矩阵乘积。

import numpy as np

a=np.mat('4 3; 2 1')b=np.mat('1 2; 3 4')print(a)# [[4 3]#  [2 1]]print(b)# [[1 2]#  [3 4]]print(a*b)# [[13 20]#  [ 5  8]]

另一方面,从Python3.5开始,NumPy支持使用@运算符,因此您可以使用Python>=3.5中的ndarray实现矩阵乘法的同样方便。

import numpy as np

a=np.array([[4, 3], [2, 1]])b=np.array([[1, 2], [3, 4]])print(a@b)# [[13 20]#  [ 5  8]]

矩阵对象和ndarray都有.T若要返回转置,但矩阵对象也具有.H对于共轭转置,和.I反之亦然。

相反,numpy数组始终遵循按元素应用操作的规则(新的除外)。@(操作员)因此,如果ab是numpy数组,那么a*b是将组件元素按顺序相乘形成的数组:

c=np.array([[4, 3], [2, 1]])d=np.array([[1, 2], [3, 4]])print(c*d)# [[4 6]#  [6 4]]

若要获得矩阵乘法的结果,请使用np.dot(或@在Python>=3.5中,如上文所示):

print(np.dot(c,d))# [[13 20]#  [ 5  8]]

这个**运算符的行为也不同:

print(a**2)# [[22 15]#  [10  7]]print(c**2)# [[16  9]#  [ 4  1]]

a是矩阵,a**2返回矩阵积a*a..自c是一条警钟,c**2返回一个包含每个组件平方元素的ndarray。

矩阵对象和ndarray之间还有其他技术差异(与np.ravel、项选择和序列行为有关)。

Numpy阵列的主要优点是它们比二维矩阵更通用.当你想要一个三维数组时会发生什么?然后你必须使用ndarray,而不是矩阵对象。因此,学习使用矩阵对象是更多的工作-你必须学习矩阵对象操作和ndarray操作。

编写一个同时使用矩阵和数组的程序会使你的生活变得困难,因为你必须跟踪你的变量是哪种类型的对象,以免乘法返回你不想要的东西。

相反,如果您只使用ndarray,那么您可以完成矩阵对象所能做的所有事情,甚至更多,除非函数/表示法稍有不同。

如果您愿意放弃NumPy矩阵乘积表示法的视觉吸引力(在Python>=3.5中使用ndarray几乎可以很好地实现它),那么我认为NumPy数组绝对是可行的。

PS。当然,你真的不必牺牲另一个而选择一个,因为np.asmatrixnp.asarray允许您将其中一个转换为另一个(只要数组是二维的)。


NumPy之间的区别有一个概要arraysVS NumPymatrix埃斯这里.


查看完整回答
反对 回复 2019-07-06
?
守候你守候我

TA贡献1802条经验 获得超10个赞

建议您使用数组:

*“数组”或“矩阵”?我该用哪一种?-简短的回答

使用数组。

  • 它们是Numpy的标准向量/矩阵/张量类型。许多numpy函数返回数组,而不是矩阵。

  • 元素运算和线性代数运算有着明显的区别.

  • 如果愿意,可以使用标准向量或行/列向量。

使用数组类型的唯一缺点是必须使用dot而不是*将两个张量(标量乘积、矩阵向量乘法等)相乘。


查看完整回答
反对 回复 2019-07-06
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

只是为了在unutbu的名单上加上一个案子。

与numpy矩阵或matlab这样的矩阵语言相比,numpy ndarray最大的实际区别之一是,减少运算中没有保留维数。矩阵总是2d,而数组的平均值,例如,其一维数就少了。

例如,贬低矩阵或数组的行:

带矩阵

>>> m = np.mat([[1,2],[2,3]])>>> m
matrix([[1, 2],
        [2, 3]])>>> mm = m.mean(1)>>> mm
matrix([[ 1.5],
        [ 2.5]])>>> mm.shape(2, 1)>>> m - mm
matrix([[-0.5,  0.5],
        [-0.5,  0.5]])

带数组

>>> a = np.array([[1,2],[2,3]])>>> a
array([[1, 2],
       [2, 3]])>>> am = a.mean(1)>>> am.shape(2,)>>> am
array([ 1.5,  2.5])>>> a - am #wrongarray([[-0.5, -0.5],
       [ 0.5,  0.5]])>>> a - am[:, np.newaxis]  #rightarray([[-0.5,  0.5],
       [-0.5,  0.5]])

我还认为混合数组和矩阵会导致许多“愉快”的调试时间。然而,稀疏矩阵通常是像乘法这样的算子的矩阵。


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 2306 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信