MATLAB转Python注意事项

MATLAB转Python注意事项

Tags
Code
经验
Published
November 18, 2020
Author
Dario Zhang
1、一定要注意ndarry的形状,numpy生成的很多结果都是(n,)的1维向量,而matlab里是(1,n)或(n,1)的二维矩阵,所以生成ndarry时要加参数ndmin=2
2、matlab从1开始索引,numpy一定要对齐索引。
3、matlab的元胞,在python用字典代替。
4、math.inf不能用于svd和inv计算
5、matlab经常用ones做索引,但matlab中的ones是int,numpy的ones默认float,所以做索引时要指定np.ones((n, 1), dtype=int)

matlab2python
matlab函数
转python说明
matlab实例
python实例
备注
用scipy.stats.pearsonr算相关系数的p值,pearsonr要输入相同形状的x、y,
[~, Pval] = corr( X', X(target_variable,:)' )
pval = np.array([pearsonr(x_i, x[target_variable, :])[1] for x_i in x])
查找满足条件的索引,如果是(1,n)的矩阵,要用np.flatnonzero才能直接得到ndarry索引,如果用nonzero会得到长度为2的tuple,分别是行索引和列索引,不能直接作为ndarry的索引使用(这里比较坑),如果是(m,n)的矩阵,必须用nonzero才能得到正确索引。
Ind_corr = find(Pval < alpha);
ind_corr = np.flatnonzero(pval < alpha)
这里的pval是1维向量,所以用flatnonzero
使用索引获取(1,n)或(n,1)的2维向量,y = x[[ind], :],如果直接用序号,numpy得到的是1维向量,matlab得到2维
X(target_variable,:)
x[[target_variable], :]
numpy对2维向量计算均值要加axis,matlab默认按列计算
mean(x')
np.mean(x.conj().T, axis=0)
复制矩阵,注意方向
repmat(mean(x')', 1, T)
np.tile(np.mean(x.conj().T, axis=0), (T, 1)).conj().T
算逆阵,numpy必须要有MKL模块才速度快,差距至少50倍,conda自带的numpy有MKL,pip安装的numpy没有。在高阶矩阵,这一步的误差和matlab差的较大。
inv(x*x')
np.linalg.inv(x @ x.conj().T)
依然要注意numpy中1维和2维向量的区别,如果想把(n,)或(1,n)的向量变成对角阵,要用np.diagflat,直接用diag只能得到标量。
diag(beta_hat)
np.diagflat(beta_hat)
beta_hat是(1,n)的矩阵
(m,n)求sum一定要加axis,matlab默认按列,numpy默认全部。
sum(abs(beta_new_o))
sum(abs(beta_new_o))
beta_new_o是(1,n)矩阵,所以没加axis
矩阵乘法,python3.5后支持@,之前用np.dot
点乘,python中用*
将A中小于k的值替换为k,其他不变,返回的形状和A相同
max(abs(beta_new_n),beta_min)
np.maximum(abs(beta_new_n), beta_min)
matlab单引号是共轭转置,numpy要用conj().T,注意numpy中(n,)的1维向量无法转置,要转为2维的(1,n)
x'
x.conj().T
矩阵形状
size(A)
A.shape
numpy要加参数ddof=1,结果才能和matlab一致,同样要注意加axis
std(new_x)
np.std(new_x, ddof=1, axis=1)
matlab默认按列,numpy要指定方向,order='F'
reshape(psi, n, p)
psi.reshape(n, p, order='F')
floor(r)
np.floor(r).astype(np.int16)