我目前正在从事一个项目,该项目涉及将在 MATLAB 中运行的程序转换为 Python 以提高速度和效率。但是,我遇到了绊脚石。首先,我对波浪号 (~) 在 MATLAB 中表示什么以及如何在 python 中以相应的方式表示感到困惑。其次,我一直在搜索文档,但我也很难在 MATLAB 中找到与“sign”函数等效的函数。
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 方法是什么?
请您参考如下方法:
如果您正在使用 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 的精彩表格和指南:Link
