【问题标题】:Translating mathematical functions from MATLAB to Python将数学函数从 MATLAB 转换为 Python
【发布时间】:2015-06-03 03:50:18
【问题描述】:

我目前正在从事一个项目,该项目涉及将在 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 数组。替换 ~ 和 sign 函数最有效的 Pythonic 方法是什么?

【问题讨论】:

标签: python matlab numpy sum sign


【解决方案1】:

如果您使用的是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

【讨论】:

  • 其实你可以用.sum()避开unravel
  • @Divakar - 谢谢。我实际上忘记了这一点。更改了我的帖子。
  • 或者保留你所说的关于np.sum 的内容并执行np.sum(wv) 之类的操作。如果不提及axis,它就会在内部解开。
  • @Divakar - 嗯。我认为默认情况下它默认为axis=0,这意味着遍历所有列。很有趣。
  • @Divakar - 有趣。那肯定会修改我的帖子。谢谢!顺便说一句,你是对的。它默认为axis=None,这意味着遍历所有维度。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 2020-10-10
  • 2022-11-09
  • 1970-01-01
  • 2013-05-13
  • 2016-11-07
相关资源
最近更新 更多