NumPy用户指南 > Matlab用户的NumPy
MATLAB®和NumPy / SciPy有很多共同点。但是有很多差异。NumPy和SciPy的创建是为了以最自然的方式使用Python进行数值和科学计算,而不是MATLAB®克隆。此页面旨在收集有关差异的知识,主要目的是帮助熟练的MATLAB®用户成为熟练的NumPy和SciPy用户。
在MATLAB®中,基本数据类型是双精度浮点数的多维数组。大多数表达式采用此类数组并返回此类数组。这些数组的2-D实例上的运算被设计为或多或少地像线性代数中的矩阵运算一样起作用。 |
在NumPy中,基本类型是多维 |
MATLAB®使用基于1(一)的索引。序列的初始元素可使用a(1)找到。 请参阅说明INDEXING |
Python使用基于0(零)的索引。序列的初始元素使用a [0]查找。 |
MATLAB®的脚本语言是为执行线性代数而创建的。基本矩阵操作的语法很好,也很干净,但是添加GUI并创建完整应用程序的API或多或少是事后的想法。 |
NumPy基于Python,从一开始就被设计为一种出色的通用编程语言。尽管Matlab用于某些数组操作的语法比NumPy的语法更紧凑,但NumPy(由于是Python的附加组件)可以完成Matlab无法完成的许多事情,例如正确处理矩阵堆栈。 |
在MATLAB®中,数组具有按值传递的语义,并且具有惰性的写时复制方案,可以防止在实际需要之前创建副本。切片操作可复制阵列的某些部分。 |
在NumPy中,数组具有按引用传递的语义。切片操作是将视图放入数组中。 |
从历史上看,NumPy提供了一种特殊的矩阵类型np.matrix,它是ndarray的子类,它使二进制运算成为线性代数运算。您可能会看到它用在某些现有代码中,而不是np.array。那么,该使用哪一个呢?
使用数组。
它们是numpy的标准向量/矩阵/张量类型。许多numpy函数返回数组,而不是矩阵。
在逐元素运算和线性代数运算之间有明显的区别。
如果愿意,可以有标准向量或行/列向量。
在Python 3.5之前,使用数组类型的唯一缺点是必须使用dot
而不是*
乘(减少)两个张量(标量积,矩阵向量乘法等)。从Python 3.5开始,您可以使用矩阵乘法@
运算符。
鉴于上述情况,我们打算matrix
最终弃用。
NumPy同时包含一个array
类和一个matrix
类。所述
array
类旨在是通用n维阵列,用于许多种数值计算的,而matrix
意在具体促进线性代数计算。实际上,两者之间只有几个关键区别。
运算符*
和@
,函数dot()
以及multiply()
:
因为array
,``*''表示元素乘法,而
``@''表示矩阵乘法 ; 它们具有关联的功能
multiply()
和dot()
。(在python 3.5之前,它@
不存在,必须dot()
用于矩阵乘法)。
为matrix
, ``*``手段矩阵乘法,以及用于逐元素乘法一个具有使用该multiply()
功能。
向量的处理(一维数组)
因为array
,矢量形状1xN,Nx1和N都是不同的东西。像这样的操作将A[:,1]
返回形状为N的一维数组,而不是形状为Nx1的二维数组。一维转置array
不执行任何操作。
对于matrix
,一维数组始终上转换为1xN或Nx1矩阵(行向量或列向量)。A[:,1]
返回形状为Nx1的二维矩阵。
处理高维数组(ndim> 2)
array
对象的维数可以大于2 ;
matrix
对象始终恰好具有二维。
便利属性
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
即使将a matrix
作为参数,某些函数也可能返回a 。NumPy函数不应该发生这种情况(如果确实是一个错误),但是基于NumPy的第三方代码可能不像NumPy那样尊重类型保留。
:)
A*B
是矩阵乘法,因此看起来就像是用线性代数编写(对于Python> = 3.5而言,普通数组与@
运算符具有相同的便利性)。
<:(
按元素乘法需要调用函数
multiply(A,B)
。
<:(
使用运算符重载有点不合逻辑:*
不是按元素工作,但/
可以。
与之交互scipy.sparse
更干净。
将array
因此更建议使用。实际上,我们打算matrix
最终弃用。
下表列出了一些常见的MATLAB®表达式的大致等效项。这些不是精确的等价物,而应作为提示使您朝正确的方向前进。有关更多详细信息,请阅读有关NumPy函数的内置文档。
在下表中,假定您已在Python中执行了以下命令:
from numpy import *
import scipy.linalg
在下面还要假设,如果Notes谈论“矩阵”,则参数是二维实体。
的MATLAB |
麻木 |
笔记 |
---|---|---|
|
|
获得有关函数func的帮助 |
|
找出在哪里定义func |
|
|
|
func的打印源(如果不是本机函数) |
|
|
短路逻辑AND运算符(Python本机运算符);仅标量参数 |
|
|
短路逻辑OR运算符(Python本机运算符);仅标量参数 |
|
|
复数 |
|
|
1和最接近的浮点数之间的距离。 |
|
|
将ODE与Runge-Kutta 4,5集成 |
|
|
将ODE与BDF方法集成 |
的MATLAB |
NumPy |
笔记 |
---|---|---|
|
|
获取数组的维数 |
|
|
获取数组元素的数量 |
|
|
得到矩阵的“大小” |
|
|
获取array的第n维元素的数量 |
|
|
2x3矩阵文字 |
|
|
从块构造一个矩阵 |
|
|
访问1xn矩阵中的最后一个元素 |
|
|
第二行第五列中的访问元素 |
|
|
整个第二行 |
|
|
的前五行 |
|
|
的最后五行 |
|
|
第1至3行,第5至9列 |
|
|
第2、4和5行以及第1和3列。这允许修改矩阵,并且不需要规则切片。 |
|
|
的其他每一行 |
|
|
的每隔一行 |
|
|
|
|
|
|
|
|
转置 |
|
|
共轭转座 |
|
|
矩阵乘法 |
|
|
逐元素相乘 |
|
|
按元素划分 |
|
|
逐元素取幂 |
|
|
第i,jth个元素为(a_ij> 0.5)的矩阵。Matlab结果是一个0和1的数组。NumPy结果是布尔值 |
|
|
找到其中( |
|
|
提取 |
|
|
提取 |
|
|
|
|
|
|
|
|
将所有值设置为相同的标量值 |
|
|
numpy通过引用分配 |
|
|
numpy切片是通过引用 |
|
|
将数组转换为向量(请注意,这会强制复制) |
|
|
创建一个递增向量(请参阅注释RANGES) |
|
|
创建一个递增向量(请参阅注释RANGES) |
|
|
创建列向量 |
|
|
充满64位浮点零的3x4二维数组 |
|
|
3x4x5充满64位浮点零的三维数组 |
|
|
充满64位浮点数的3x4二维数组 |
|
|
3x3单位矩阵 |
|
|
对角线元素的向量 |
|
|
非零值是的元素的平方对角矩阵
|
|
|
随机3x4矩阵 |
|
|
1至3(含1和3)之间的4个等距样本 |
|
|
两个2D数组:x值之一,y值另一个 |
|
评估网格功能的最佳方法 |
|
|
|
|
|
评估网格功能的最佳方法 |
|
|
|
创建n的m×n个副本 |
|
|
连接 |
|
|
连接 |
|
|
的最大元素 |
|
|
矩阵每一列的最大元素 |
|
|
矩阵每一行的最大元素 |
|
|
比较 |
|
|
向量的L2范数 |
|
|
逐元素AND运算符(NumPy ufunc)请参阅注释LOGICOPS |
|
|
逐元素OR运算符(NumPy ufunc)请参阅注释LOGICOPS |
|
|
按位AND运算符(Python本机和NumPy ufunc) |
|
|
按位或运算符(Python本机和NumPy ufunc) |
|
|
方阵的逆 |
|
|
矩阵的伪逆 |
|
|
2D阵列/矩阵的矩阵等级 |
|
|
x的ax = b的解 |
|
求解aT xT = bT |
x的xa = b的解 |
|
|
的奇异值分解 |
|
|
矩阵的cholesky分解( |
|
|
的特征值和特征向量 |
|
|
特征值和特征向量 |
|
找到 |
|
|
|
QR分解 |
|
|
LU分解(注意:P(Matlab)==转置(P(numpy))) |
|
|
共轭梯度求解器 |
|
|
的傅立叶变换 |
|
|
的傅立叶逆变换 |
|
|
排序矩阵 |
|
|
排序矩阵的行 |
|
|
多元线性回归 |
|
|
带低通滤波的下采样 |
|
|
|
|
|
子矩阵:可以使用ix_
命令使用索引列表完成对子矩阵的分配。例如,对于二维数组a
,一个可以做:ind=[1,3]; a[np.ix_(ind,ind)]+=100
。
帮助:没有与MATLAB which
命令直接等效的命令,但是命令help
和source
通常会列出函数所在的文件名。Python还具有一个inspect
模块(do import inspect
),该模块
getfile
经常提供功能。
索引:MATLAB®使用基于1的索引,因此序列的初始元素具有索引1。Python使用基于0的索引,因此序列的初始元素具有索引0。由于每个都有优点和缺点,所以会引起混乱和争吵。基于索引的索引与人类常用语言一致,其中序列的“第一个”元素具有索引1。基于零的索引简化了索引。另请参阅prof.dr的文字。Edsger W. Dijkstra。
范围:在MATLAB®中,0:5
既可以用作范围文字,也可以用作“切片”索引(括号内);然而,在Python,样构建0:5
罐仅被用作切片指数(方括号内)。因此,r_
创建了一个有点古怪的对象,以使numpy具有类似的简洁范围构造机制。请注意,
r_
它不是像函数或构造函数那样调用,而是
使用方括号索引,这允许在参数中使用Python的slice语法。
LOGICOPS:&或| 在NumPy中是按位与/或,而在Matlab中&和| 是逻辑AND / OR。具有丰富编程经验的任何人都应该清楚区别。两者的工作原理似乎相同,但有一些重要区别。如果您使用过Matlab的&或| 运算符,则应使用NumPy ufuncs logical_and / logical_or。Matlab和NumPy的&和|之间的显着差异 运算符是:
非逻辑{0,1}输入:NumPy的输出是输入的按位与。Matlab将任何非零值视为1,然后返回逻辑AND。例如,NumPy中的(3&4)为0,而在Matlab中,3和4都被视为逻辑真,而(3&4)返回1。
优先级:NumPy的&运算符的优先级高于<和>等逻辑运算符;Matlab是相反的。
如果您知道自己具有布尔参数,则可以使用NumPy的按位运算符,但请小心括号,例如:z =(x> 1)&(x <2)。缺少NumPy运算符形式的logical_and和logical_or是Python设计的不幸结果。
重塑和线性索引注意:Matlab始终允许使用标量或线性索引访问多维数组,而NumPy则不允许。线性索引在Matlab程序中很常见,例如,矩阵上的find()返回线性索引,而NumPy的查找行为不同。转换Matlab代码时,可能有必要先将矩阵整形为线性序列,执行一些索引操作,然后再整形。由于整形(通常)在同一存储上产生视图,因此应该可以相当有效地做到这一点。请注意,在NumPy中,整形使用的扫描顺序默认为“ C”顺序,而Matlab使用Fortran顺序。如果您只是简单地转换为线性序列然后返回,则无所谓。但是,如果要从依赖于扫描顺序的Matlab代码转换重塑形状,则此Matlab代码:z = reshape(x,3,4); 应该变成z = x.reshape(3,4,
在MATLAB®中,可用于自定义环境的主要工具是使用您喜欢的函数的位置来修改搜索路径。您可以将此类自定义放入启动脚本中,以便MATLAB在启动时运行。
NumPy,或者说Python,具有类似的功能。
要修改Python搜索路径以包括自己模块的位置,请定义PYTHONPATH
环境变量。
要在启动交互式Python解释器时执行特定的脚本文件,请定义PYTHONSTARTUP
环境变量以包含启动脚本的名称。
与MATLAB®不同,后者可以立即调用路径上的任何内容,而对于Python,则需要首先执行“ import”语句,以使特定文件中的函数可访问。
例如,您可以制作一个如下所示的启动脚本(注意:这仅是示例,并非对“最佳实践”的陈述):
# Make all numpy available via shorter 'np' prefix
import numpy as np
# Make all matlib functions accessible at the top level via M.func()
import numpy.matlib as M
# Make some matlib functions accessible directly at the top level via, e.g. rand(3,3)
from numpy.matlib import rand,zeros,ones,empty,eye
# Define a Hermitian function
def hermitian(A, **kwargs):
return np.transpose(A,**kwargs).conj()
# Make some shortcuts for transpose,hermitian:
# np.transpose(A) --> T(A)
# hermitian(A) --> H(A)
T = np.transpose
H = hermitian
有关另一个MATLAB®/ NumPy交叉引用,请参见http://mathesaurus.sf.net/。
可以在主题软件页面中找到使用python进行科学工作的大量工具列表。
MATLAB®和SimuLink®是The MathWorks的注册商标。