NumPy与 Matlab 比较

介绍

MATLAB®和NumPy / SciPy有很多共同之处。但是有很多不同之处。创建NumPy和SciPy是为了用Python最自然的方式进行数值和科学计算,而不是MATLAB®克隆。本页面旨在收集有关差异的智慧,主要是为了帮助熟练的MATLAB®用户成为熟练的NumPy和SciPy用户。
一些关键的差异
MATLAB NumPy
在MATLAB®中,基本数据类型是双精度浮点数的多维数组。大多数表达式采用这样的数组并返回这样的数 对这些数组的2-D实例的操作被设计成或多或少地像线性代数中的矩阵运算。 在NumPy中,基本类型是多维的array。包括2D在内的所有维度中对这些数组的操作是逐元素操作。人们需要使用线性代数的特定函数(尽管对于矩阵乘法,可以@在python 3.5及更高版本中使用运算符)。
MATLAB®使用基于1(一)的索引。使用(1)找到序列的初始元素。 请参阅备注 Python使用基于0(零)的索引。使用[0]找到序列的初始元素。
MATLAB®的脚本语言是为执行线性代数而创建的。基本矩阵操作的语法很好而且干净,但是用于添加GUI和制作完整应用程序的API或多或少都是事后的想法。 NumPy基于Python,它从一开始就被设计成一种优秀的通用编程语言。虽然Matlab的一些数组操作的语法比NumPy更紧凑,但NumPy(由于是Python的附加组件)可以做许多Matlab不能做的事情,例如正确处理矩阵堆栈。
在MATLAB®中,数组具有按值传递的语义,并具有惰性写入时复制方案,以防止在实际需要之前实际创建副本。切片操作复制数组的一部分。 在NumPy数组中有传递引用语义。切片操作是对数组的视图。
‘array’或’matrix’?我应该使用哪个?

从历史上看,NumPy提供了一种特殊的矩阵类型 np.matrix ,它是ndarray的子​​类,它使二进制运算成为线性代数运算。您可能会在某些现有代码中看到它而不是 np.array 。那么,使用哪一个?

简答

使用数组。

它们是numpy的标准矢量/矩阵/张量类型。许多numpy函数返回数组,而不是矩阵。
元素操作和线性代数操作之间有明显的区别。
如果您愿意,可以使用标准向量或行/列向量。

在Python 3.5之前,使用数组类型的唯一缺点是你必须使用dot而不是*乘法(减少)两个张量(标量乘积,矩阵向量乘法等)。从Python 3.5开始,您可以使用矩阵乘法@运算符。

鉴于上述情况,我们打算matrix最终弃用。

长答案

NumPy包含array类和matrix类。所述
array类旨在是对许多种数值计算的通用n维数组中,而matrix意在具体促进线性代数计算。在实践中,两者之间只有少数关键差异。

运算符*和@函数dot(),以及multiply():
    对于数组,*表示逐元素乘法,而 @ 表示矩阵乘法; 它们具有相关的函数 multiply() 和 dot() 。(在python 3.5之前,@ 不存在,并且必须使用dot() 进行矩阵乘法)。
    对于矩阵,* 表示矩阵乘法,对于逐元素乘法,必须使用 multiply() 函数。
矢量处理(一维数组)
    对于数组,向量形状1xN,Nx1和N都是不同的东西。 像 A[:, 1] 这样的操作返回形状N的一维数组,而不是形状Nx1的二维数组。 在一维数组上转置什么都不做。
    对于矩阵,一维数组总是被上变频为1xN或Nx1矩阵(行或列向量)。A[:, 1] 返回形状为Nx1的二维矩阵。
处理更高维数组(ndim> 2)
    数组对象的维数可以 > 2 ;
    矩阵对象总是有两个维度。
便利属性
    array 有一个.T属性,它返回数据的转置。
    matrix 还有.H,.I和.A属性,分别返回共轭转置,反转和asarray()矩阵。
便利构造函数
    该array构造采用(嵌套)的Python序列初始化。如:array([[1,2,3],[4,5,6]])。
    该matrix构造还需要一个方便的字符串初始化。如:matrix("[1 2 3; 4 5 6]")。

使用两者有利有弊:


    array
        :) 元素乘法很容易:A*B。
        :( 你必须记住,矩阵乘法有自己的运算符@。
        :) 可以将一维数组视为行向量或列向量。 A @ v 将 v 视为列向量,而 v @ A 将 v 视为行向量。这可以节省您键入许多转置。
        :) array 是“默认”NumPy类型,因此它获得的测试最多,并且是使用NumPy的第三方代码最有可能返回的类型。
        :) 非常擅长处理任何维度的数据。
        :) 如果你熟悉那么语义学更接近张量代数。
        :) 所有 操作(*/+-等)逐元素。
        :( 稀疏矩阵scipy.sparse不与数组交互。
    matrix
        :\\ 行为更像MATLAB®矩阵。
        <:( 最大二维。要保存您需要的三维数据,array或者可能是Python列表matrix。
        <:( 最小二维。你不能有载体。它们必须作为单列或单行矩阵进行转换。
        <:( 由于array是NumPy中的默认值,因此array即使您将它们matrix作为参数给出,某些函数也可能返回。这不应该发生在NumPy函数中(如果它确实是一个错误),但基于NumPy的第三方代码可能不像NumPy那样遵守类型保存。
        :) A*B是矩阵乘法,所以它看起来就像你在线性代数中写的那样(对于Python> = 3.5普通数组与@运算符具有相同的便利性)。
        <:( 元素乘法需要调用函数, multiply(A,B)<:( 运算符重载的使用有点不合逻辑:* 不能按元素操作,但 / 确实如此。
        与之互动scipy.sparse有点清洁。

因此,使用 数组(array) 要明智得多。事实上,我们打算最终废除 矩阵(matrix)。
MATLAB 和 NumPy粗略的功能对应表

下表给出了一些常见MATLAB®表达式的粗略等价物。这些不是确切的等价物,而应该作为提示让你朝着正确的方向前进。有关更多详细信息,请阅读NumPy函数的内置文档。

更多请见:http://www.mark-to-win.com/tutorial/52205.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值