为什么数组可传入基于numpy的lambda函数,却不能传入普通lambda函数?
报错原因详解
两个lambda的执行逻辑存在本质差异,具体原因如下:
relu[0]调用的是np.maximum,这是NumPy原生实现的向量化运算接口,天然支持传入列表、NumPy数组等多元素序列,会自动遍历序列内的每个元素执行max(0, 元素值)的计算,最终返回和输入形状一致的结果,所以无论是单个数值还是数组输入都能正常执行。relu[1]中的核心逻辑是三元表达式1 if x > 0 else 0:- 当输入是单个数值时,
x > 0返回单个布尔值True/False,三元表达式可以正常判断返回对应结果,运行无问题。 - 当输入是普通Python列表时,Python原生不支持
列表 > 整数的比较操作,直接抛出TypeError。 - 当输入是NumPy数组时,
数组 > 0会返回一个和输入数组形状相同的布尔数组,但Python的三元表达式无法直接对整个布尔数组做真值判断,会抛出ValueError: The truth value of an array with more than one element is ambiguous错误。
- 当输入是单个数值时,
- 列表推导式可以正常运行的原因:遍历过程中每次传入
relu[1]的都是单个数值,完全符合第二个lambda的输入要求,因此不会触发报错。
如果需要让第二个lambda也支持数组输入,可以改成向量化实现:
lambda x: (np.asarray(x) > 0).astype(int)
内容的提问来源于stack exchange,提问作者user15747807
相关产品推荐
相关产品推荐

