【问题标题】:Why I can pass an array as input to a lambda function that uses numpy but I cant pass it to a lambda function without numpy?为什么我可以将数组作为输入传递给使用 numpy 的 lambda 函数,但我不能将它传递给没有 numpy 的 lambda 函数?
【发布时间】:2021-12-20 15:43:35
【问题描述】:

从这两个 lambda 函数开始

import numpy as np

relu = (lambda x: np.maximum(0, x),
        lambda x: 1 if x > 0 else 0)

显然,当我传递一个数字时,这两个函数可以正常工作,但是当我传递一个数组/列表时,relu[0] 有效,但 relu[1] 无效。

a = [1, 2, 3, 4]
print(relu[0](a))  # this one works
print(relu[1](a))  # not works
print([relu[1](v) for v in a])  # also works

【问题讨论】:

  • 因为relu[0] 调用了一个接受向量的numpy 函数,而relu[1] 是一个不接受向量的普通Python 表达式。
  • 错误信息是什么?它会很清楚为什么这不起作用。
  • 你能澄清你到底在问什么吗?你可以传入一个numpy数组就好了。你不能做的是对 numpy 数组执行一个对 numpy 数组没有意义的操作(测试它是否大于 0)——就像你不能对 任何其他值 执行操作一样操作定义不明确(例如测试dict 是否大于0)。

标签: python arrays function numpy lambda


【解决方案1】:

许多 numpy 函数,例如maximum,接受array-like参数,即可以转换为numpy数组的类型,numpy会自动将它们转换为numpy数组。

a = [1, 2, 3, 4]
print(relu[0](a))  # a is converted from list to numpy array

您的第二个示例引发了 TypeError

TypeError: '>' not supported between instances of 'list' and 'int'

因为您无法比较 listint
比较问题中的最后两个示例:

print(relu[1](a))  # compare 'list' to 'int': Fail
print([relu[1](v) for v in a])  # compare 'int' to 'int': OK

就像Nils Werner 提到的那样,如果您将函数放在同一个容器中,最好确保它们接受相同的参数,即它们具有相同的接口。
但是,由于您在relu 中的两个函数都在做同样的事情,我想您只是举个例子来说明您的疑问。

【讨论】:

  • 这不是一个好的解决方案,因为这两个函数仍然使用不同的接口:一个接受类数组,另一个只接受标量。最好自己调整功能。
  • @NilsWerner 我同意你说的。但是,我试图解释为什么有些例子有效,而有些则无效。所有代码均取自问题。我将编辑我的答案以避免这种误解。
  • 我认为问题是“为什么”这不起作用,而不是“如何”这样做;所以我只是陈述原因。
【解决方案2】:

你可以,如果你确定x是一个使用np.asarray()的数组然后使用np.where()

relu = (
    lambda x: np.maximum(0, np.asarray(x)),
    lambda x: np.where(np.asarray(x) > 0, 1, 0),
)
relu[0]([-1, 0, 1, 2])
# array([0, 0, 1, 2])
relu[1]([-1, 0, 1, 2])
# array([0, 0, 1, 1])

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多