關於Python下的Matlab函數對應關系(Numpy)

Matlab函數對應關系(Numpy)

首先給出官網鏈接,其中詳細說明瞭在Python下如何用Numpy實現Matlab下相同的函數功能。

博主在用Python撰寫代碼的時候,想用Python實現在Matlab下某個函數的功能(比如Repmat函數),但是當使用語句

from numpy.matlib import repmat
A = repmat(B, 1, 2)

調用工具包時,雖然可以正常實現功能,但是PyCharm下報出警告:

Importing from numpy.matlib is deprecated since 1.19.0. The matrix subclass is not the recommended way to represent matrices or deal with linear algebra (see https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html). Please adjust your code to use regular ndarray.

隨後,通過查閱資料,發現是因為從1.19.0版本後,numpy就不再推薦使用numpy.matlib來實現對應功能瞭。

因此,大傢可以對照官網上的說明來實現替換。

這裡截取一小部分:

其他的可以從官網上面找到。

Numpy與Matlab互轉操作

在日常使用中,matlab作為我們機器學習以及深度學習的模型訓練使用的工具,而線上使用python實現模型落地。因為不可避免常遇到matlab與numpy之間有些操作需要相互轉換。

1、常用操作(參考numpy官方說明)

MATLAB numpy 說明
helpfunc info(func) or help(func) orfunc? (in Ipython) 獲得函數的幫助
whichfunc see note HELP 查找函數的定義
typefunc source(func) or func?? (inIpython) 查看函數源碼
a && b a and b 邏輯運算與操作
a || b a or b 邏輯運算或操作
1*i, 1*j,1i, 1j 1j 復數
eps np.spacing(1) 1與最小浮點數的距離
ode45 scipy.integrate.solve_ivp(f) 求解同階微分方程-Kutta 4,5
ode15s scipy.integrate.solve_ivp(f, method='BDF') 求解變階微分方程

2、線性變換(參考numpy官方說明)

MATLAB NumPy
ndims(a) ndim(a) or a.ndim
numel(a) size(a) or a.size
size(a) shape(a) or a.shape
size(a,n) a.shape[n-1]
[ 1 2 3; 4 5 6 ] array([[1.,2.,3.], [4.,5.,6.]])
[ a b; c d ] vstack([hstack([a,b]), hstack([c,d])]) or bmat('a b; c d')
a(end) a[-1]
a(2,5) a[1,4]
a(2,:) a[1] or a[1,:]
a(1:5,:) a[0:5] or a[:5] or a[0:5,:]
a(end-4:end,:) a[-5:]
a(1:3,5:9) a[0:3][:,4:9]
a([2,4,5],[1,3]) a[ix_([1,3,4],[0,2])]
a(3:2:21,:) a[ 2:21:2,:]
a(1:2:end,:) a[ ::2,:]
a(end:-1:1,:) or flipud(a) a[ ::-1,:]
a([1:end 1],:) a[r_[:len(a),0]]
a.' a.transpose() or a.T
a' a.conj().transpose() or a.conj().T
a * b a.dot(b)
a .* b a * b
a./b a/b
a.^3 a**3
(a>0.5) (a>0.5)
find(a>0.5) nonzero(a>0.5)
a(:,find(v>0.5)) a[:,nonzero(v>0.5)[0]]
a(:,find(v>0.5)) a[:,v.T>0.5]
a(a<0.5)=0 a[a<0.5]=0
a .* (a>0.5) a * (a>0.5)
a(:) = 3 a[:] = 3
y=x y = x.copy()
y=x(2,:) y = x[1,:].copy()
y=x(:) y = x.flatten()
1:10 arange(1.,11.) or r_[1.:11.] or r_[1:10:10j]
0:9 arange(10.) or r_[:10.] or r_[:9:10j]
[1:10]' arange(1.,11.)[:, newaxis]
zeros(3,4) zeros((3,4))
zeros(3,4,5) zeros((3,4,5))
ones(3,4) ones((3,4))
eye(3) eye(3)
diag(a) diag(a)
diag(a,0) diag(a,0)
rand(3,4) random.rand(3,4)
linspace(1,3,4) linspace(1,3,4)
[x,y]=meshgrid(0:8,0:5) mgrid[0:9.,0:6.] or meshgrid(r_[0:9.],r_[0:6.]
ogrid[0:9.,0:6.] or 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))
[a b] concatenate((a,b),1) or hstack((a,b)) or column_stack((a,b))
[a; b] concatenate((a,b)) or vstack((a,b)) or r_[a,b]
max(max(a)) a.max()
max(a) a.max(0)
max(a,[],2) a.max(1)
max(a,b) maximum(a, b)
norm(v) sqrt(dot(v,v)) or np.linalg.norm(v)
a & b logical_and(a,b)
a | b logical_or(a,b)
bitand(a,b) a & b
bitor(a,b) a | b
inv(a) linalg.inv(a)
pinv(a) linalg.pinv(a)
rank(a) linalg.matrix_rank(a)
a\b linalg.solve(a,b) if a is square; linalg.lstsq(a,b) otherwise
b/a Solve a.T x.T = b.T instead
[U,S,V]=svd(a) U, S, Vh = linalg.svd(a), V = Vh.T
chol(a) linalg.cholesky(a).T
[V,D]=eig(a) D,V = linalg.eig(a)
[V,D]=eig(a,b) V,D = np.linalg.eig(a,b)
[V,D]=eigs(a,k)
[Q,R,P]=qr(a,0) Q,R = scipy.linalg.qr(a)
[L,U,P]=lu(a) L,U = scipy.linalg.lu(a) or LU,P=scipy.linalg.lu_factor(a)
conjgrad scipy.sparse.linalg.cg
fft(a) fft(a)
ifft(a) ifft(a)
sort(a) sort(a) or 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()

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: