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 中的矩阵和向量

你可能感兴趣的:(Numpy | 与Matlab科学计算对比)