介绍
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函数的内置文档。