为什么我可以将数组作为输入传递给使用 numpy 的 lambda 函数,但我不能将它传递给没有 numpy 的 lambda 函数?

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?

从这两个lambda函数开始

import numpy as np

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

显然,当我传递一个数字时,这两个函数可以正常工作,但是当我传递一个 array/list 时,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

你可以,如果你确定 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])

许多 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 中的两个函数都在做同样的事情,我想你只是举个例子来证明你的疑虑。