为什么我可以将数组作为输入传递给使用 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'
因为您无法比较 list
和 int
。
比较问题中的最后两个示例:
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
中的两个函数都在做同样的事情,我想你只是举个例子来证明你的疑虑。
从这两个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'
因为您无法比较 list
和 int
。
比较问题中的最后两个示例:
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
中的两个函数都在做同样的事情,我想你只是举个例子来证明你的疑虑。