将数学函数从MATLAB转换为Python

时间:2015-06-02 14:34:46

标签: python matlab numpy sum sign

我目前正在开展一个项目,该项目涉及将在MATLAB中运行的程序转换为Python以提高速度和效率。但是,我遇到了绊脚石。首先,我对于在MATLAB中波形符(〜)表示什么感到困惑,以及如何在python中以相应的方式表示它。其次,我一直在搜索文档,我也很难找到一个等同的功能来签署' MATLAB中的函数。

    indi = ~abs(indexd);
    wav = (sum(sum(wv)))/(length(wv)*(length(wv)-1));
    thetau = (sign(sign(wv - wav) - 0.1) + 1)/2;
    thetad = (sign(sign(wav - wv) - 0.1) + 1)/2;

我已经将indexd和wv(从前一段代码中)转换为numpy数组。什么是最有效的Pythonic方法来替换〜和sign函数?

1 个答案:

答案 0 :(得分:5)

如果您正在使用numpy,那么您也可以使用~来反转内容,就像使用MATLAB一样。见:What does the unary operator ~ do in numpy?sign功能也存在于numpy中。您使用numpy.sign。因此,上面的代码只是:

>>> import numpy as np
>>> indi = ~np.abs(indexd)
>>> wav = (np.sum(wv))/(len(wv)*(len(wv)-1))
>>> thetau = (np.sign(np.sign(wv - wav) - 0.1) + 1)/2
>>> thetad = (np.sign(np.sign(wav - wv) - 0.1) + 1)/2

建议在矩阵的MATLAB中使用length找到矩阵中的最大维度,而numpy使用len来给出矩阵中的总行数。假设wv中的行数大于或等于wv中的列数,则上述代码将按预期工作。但是,如果列数多于行数,那么您需要的是找到最大尺寸并使用它而不是......所以:

>>> import numpy as np
>>> maxdim = np.max(wv.shape)
>>> indi = ~np.abs(indexd)
>>> wav = (np.sum(wv))/(maxdim*(maxdim-1))
>>> thetau = (np.sign(np.sign(wv - wav) - 0.1) + 1)/2
>>> thetad = (np.sign(np.sign(wav - wv) - 0.1) + 1)/2

以上对numpy.sum的调用实际上默认对所有维度进行求和,因此无需调用嵌套sum调用来对整个矩阵求和(感谢Divakar!)

完全建议你去这里看看从MATLAB翻译到numpy的真棒表和指南:http://wiki.scipy.org/NumPy_for_Matlab_Users