Numpy | 与Matlab科学计算对比

Numpy与Matlab科学计算对比

MATLAB®和NumPy / SciPy有很多共同之处。但是有很多不同之处。创建NumPy和SciPy是为了用Python最自然的方式进行数值和科学计算,而不是MATLAB®克隆。

关键的差异

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数组中有传递引用语义。切片操作是对数组的视图。

MATLAB 和 NumPy粗略的功能对应表

一般功能的对应表

MATLAB NumPy 注释
help func info(func)或者help(func)或func?(在IPython的) 获得函数func的帮助
which func 请参阅备注 找出func定义的位置
type func source(func)或者func??(在Ipython中) func的打印源(如果不是本机函数)
a && b a and b 短路逻辑AND运算符(Python本机运算符); 只有标量参数
a b
1i,1j, 1i,1j 1j 复数
eps np.spacing(1) 1与最近的浮点数之间的距离。
ode45 scipy.integrate.solve_ivp(f) 将ODE与Runge-Kutta 4,5集成
ode15s scipy.integrate.solve_ivp(f, method='BDF') 将ODE与BDF方法集成

线性代数功能对应表

MATLAB NumPy 注释
ndims(a) ndim(a) 要么 a.ndim 获取数组的维数
numel(a) size(a) 要么 a.size 获取数组的元素数
size(a) shape(a) 要么 a.shape 得到矩阵的“大小”
size(a,n) a.shape[n-1] 获取数组第n维元素的数量a。(请注意,MATLAB®使用基于1的索引,而Python使用基于0的索引,请参阅备注
[ 1 2 3; 4 5 6 ] array([[1.,2.,3.], [4.,5.,6.]]) 2x3矩阵文字
[ a b; c d ] block([[a,b], [c,d]]) 从块构造一个矩阵a,b,c,和d
a(end) a[-1] 访问1xn矩阵中的最后一个元素 a
a(2,5) a[1,4] 访问第二行,第五列中的元素
a(2,:) a[1] 或者 a[1,:] a的第二行
a(1:5,:) a[0:5]或a[:5]或a[0:5,:] 前五行 a
a(end-4:end,:) a[-5:] a的最后五行
a(1:3,5:9) a[0:3][:,4:9] a的第一至第三行与第五至第九列交叉的元素。这提供了只读访问权限。
a([2,4,5],[1,3]) a[ix_([1,3,4],[0,2])] 第2,4,5行与第1,3列交叉的元素。这允许修改矩阵,并且不需要常规切片。
a(3:2:21,:) a[ 2:21:2,:] 返回a的第3行与第21行之间每隔一行的行,即第3行与第21行之间的a的奇数行
a(1:2:end,:) a[ ::2,:] 返回a的奇数行
a(end: -1:1,:) 要么 flipud(a) a[ ::-1,:] 以相反的顺序排列的a的行
a([1:end 1],: ) a[r_[:len(a),0]] a 的第一行添加到a的末尾行的副本
a.' a.transpose() 要么 a.T 转置 a
a' a.conj().transpose() 要么 a.conj().T 共轭转置 a
a * b a @ b 矩阵乘法
a .* b a * b 元素乘法
a./b a/b 元素除法
a.^3 a**3 元素取幂
(a>0.5) (a>0.5) 其i,jth元素为(a_ij> 0.5)的矩阵。Matlab结果是一个0和1的数组。NumPy结果是布尔值的数组False和True。
find(a>0.5) nonzero(a>0.5) 找到a中所有大于0.5的元素的线性位置
a(:,find(v>0.5)) a[:,nonzero(v>0.5)[0]] 提取a中向量v> 0.5的对应的列
a(:,find(v>0.5)) a[:,v.T>0.5] 提取a中向量v> 0.5的对应的列
a(a<0.5)=0 a[a<0.5]=0 a中小于0.5的元素赋值为0
a .* (a>0.5) a * (a>0.5) 返回一个数组,若a中对应位置元素大于0.5,取该元素的值;若a中对应元素<=0.5,取值0
a(: ) = 3 a[:] = 3 将所有值设置为相同的标量值
y=x y = x.copy() numpy通过引用分配
y=x(2,:) y = x[1,:].copy() numpy切片是参考
y=x(: ) y = x.flatten() 将数组转换为向量(请注意,这会强制复制)
1:10 arange(1.,11.)或r_[1.:11.]或 r_[1:10:10j] 创建一个增加的向量,步长为默认值1(参见备注
0:9 arange(10.)或 r_[:10.]或 r_[:9:10j] 创建一个增加的向量,步长为默认值1(参见注释范围)
[1:10]' arange(1.,11.)[:, newaxis] 创建列向量
zeros(3,4) zeros((3,4)) 3x4二维数组,充满64位浮点零
zeros(3,4,5) zeros((3,4,5)) 3x4x5三维数组,全部为64位浮点零
ones(3,4) ones((3,4)) 3x4二维数组,充满64位浮点数
eye(3) eye(3) 3x3单位矩阵
diag(a) diag(a) 返回a的对角元素
diag(a,0) diag(a,0) 方形对角矩阵,其非零值是元素 a
rand(3,4) random.rand(3,4) 要么 random.random_sample((3, 4)) 随机3x4矩阵
linspace(1,3,4) linspace(1,3,4) 4个等间距的样本,介于1和3之间
[x,y]=meshgrid(0:8,0:5) mgrid[0:9.,0:6.] 要么 meshgrid(r_[0:9.],r_[0:6.] 两个2D数组:一个是x值,另一个是y值
ogrid[0:9.,0:6.] 要么 ix_(r_[0:9.],r_[0:6.] 在网格上评估函数的最佳方法
[x,y]=meshgrid([1,2,4],[2,4,5]) meshgrid([1,2,4],[2,4,5])
ix_([1,2,4],[2,4,5]) 在网格上评估函数的最佳方法
repmat(a, m, n) tile(a, (m, n)) 用n份副本创建m a
[a b] concatenate((a,b),1)或者hstack((a,b))或 column_stack((a,b))或c_[a,b] 连接a和的列b
[a; b] concatenate((a,b))或vstack((a,b))或r_[a,b] 连接a和的行b
max(max(a)) a.max() 最大元素a(对于matlab,ndims(a)<= 2)
max(a) a.max(0) 每列矩阵的最大元素 a
max(a,[],2) a.max(1) 每行矩阵的最大元素 a
max(a,b) maximum(a, b) 比较a和b逐个元素,并返回每对中的最大值
norm(v) sqrt(v @ v) 要么 np.linalg.norm(v) L2矢量的规范 v
a & b logical_and(a,b) 逐个元素AND运算符(NumPy ufunc请参阅备注LOGICOPS
a b logical_or(a,b)
bitand(a,b) a & b 按位AND运算符(Python native和NumPy ufunc)
bitor(a,b) a b
inv(a) linalg.inv(a) 方阵的逆 a
pinv(a) linalg.pinv(a) 矩阵的伪逆 a
rank(a) linalg.matrix_rank(a) 二维数组/矩阵的矩阵秩 a
a\b linalg.solve(a,b)如果a是正方形; linalg.lstsq(a,b) 除此以外 ax = b的解为x
b/a 解决aT xT = bT xa = b的解为x
[U,S,V]=svd(a) U, S, Vh = linalg.svd(a), V = Vh.T 奇异值分解 a
chol(a) linalg.cholesky(a).T 矩阵的cholesky分解(chol(a)在matlab中返回一个上三角矩阵,但linalg.cholesky(a)返回一个下三角矩阵)
[V,D]=eig(a) D,V = linalg.eig(a) 特征值和特征向量 a
[V,D]=eig(a,b) D,V = scipy.linalg.eig(a,b) 特征值和特征向量a,b
[V,D]=eigs(a,k) 找到k最大的特征值和特征向量a
[Q,R,P]=qr(a,0) Q,R = scipy.linalg.qr(a) QR分解
[L,U,P]=lu(a) L,U = scipy.linalg.lu(a) 要么 LU,P=scipy.linalg.lu_factor(a) LU分解(注:P(Matlab)==转置(P(numpy)))
conjgrad scipy.sparse.linalg.cg 共轭渐变求解器
fft(a) fft(a) 傅立叶变换 a
ifft(a) ifft(a) 逆傅立叶变换 a
sort(a) sort(a) 要么 a.sort() 对矩阵进行排序
[b,I] = sortrows(a,i) I = argsort(a[:,i]), b=a[I,:] 对矩阵的行进行排序
regress(y,X) linalg.lstsq(X,y) 多线性回归
decimate(x, q) scipy.signal.resample(x, len(x)/q) 采用低通滤波的下采样
unique(a) unique(a)
squeeze(a) a.squeeze()

备注

逻辑运算:&或| 在NumPy中是按位AND / OR,而在Matlab&和|中 是逻辑AND / OR。

优先级:NumPy的&运算符优先于<和>之类的逻辑运算符; Matlab是相反的。

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

Numpy手册
NumPy 中的矩阵和向量

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355