将数学函数从MATLAB转换为Python

Bra*_*ley 1 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;
Run Code Online (Sandbox Code Playgroud)

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

ray*_*ica 5

如果您正在使用numpy,那么您也可以~像MATLAB一样使用反转方法.请参阅:一元运算符〜在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
Run Code Online (Sandbox Code Playgroud)

请注意,length在MATLAB中使用矩阵可以找到矩阵中的最大维度,而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
Run Code Online (Sandbox Code Playgroud)

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

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