【问题标题】:Arrayfun in Python?Python中的Arrayfun?
【发布时间】:2021-01-08 21:18:36
【问题描述】:

我正在尝试将一些代码从 Matlab 转换为 Python。知道我将如何转换这条线吗?我对 python 很陌生,以前从未见过arrayfun。谢谢。非常感激。

 zj=arrayfun(@sigmoid,aj);

【问题讨论】:

  • 你读过documentation吗?它只是一个伪装的for 循环。您甚至可以矢量化 sigmoid 函数并完全摆脱循环。
  • @horchler 这不是变相的 for 循环。它带有自己的优化。至少,如果它不优化任何东西,它会在每次迭代中避免解释器。

标签: python matlab


【解决方案1】:

每当您处理数值数据时,您都需要使用数值库numpy

其中,名为arrayfun 的Matlab 函数只是该函数的向量化形式。例如

Matlab:

>> a = 1:4

a =

     1     2     3     4

>> arrayfun(@sqrt, a)

ans =

    1.0000    1.4142    1.7321    2.0000

>> sqrt(a)

ans =

    1.0000    1.4142    1.7321    2.0000

而在 numpy 中,你会这样做:

>>> import numpy as np
>>> a = np.arange(4)
>>> np.sqrt(a)
array([ 0.        ,  1.        ,  1.41421356,  1.73205081])

大多数函数都可以向量化,sigmoid 也不例外。例如,如果 sigmoid 被定义为1./(1 + exp(-x)),那么你可以用 Python 编写:

def sigmoid(x):
    return 1./(1 + np.exp(-x))

zj = sigmoid(aj)

【讨论】:

  • 如果您的特定函数不能直接矢量化,并且您愿意以性能损失换取不做任何工作,numpy 提供了 numpy.vectorize(...) ,这是有效的,与 Matlab arrayfun(...) 函数正在执行的 for 循环包装相同。
【解决方案2】:

通用方式,使用循环:

 zj=[sigmoid(x) for x in aj]

【讨论】:

    【解决方案3】:

    虽然所有的回复都是正确的,而且列表理解可能是首选的编写方式,因为它读起来非常优雅,但我确实觉得有必要做一个补充:在我看来,arrayfun 到 Python 的最直接翻译是还是map。它返回一个迭代器,例如传递给list 完全模仿arrayfun 将为您做的事情。换句话说,在我看来,list(map(sigmoid,aj))arryfun(@sigmoid,aj) 的更直接的翻译。

    【讨论】:

    • 对我来说,这是更好的答案。 arrayfun 是遍历数组所有元素的任意函数的映射操作。那是 Python 中的地图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多