Python 将lambda表达式应用于数组元素时发生ValueError

Python 将lambda表达式应用于数组元素时发生ValueError,python,arrays,numpy,lambda,runtime-error,Python,Arrays,Numpy,Lambda,Runtime Error,目前,我在处理numpy.array-4x1-e [[-1.96113883] [-3.46144244] [ 5.075857 ] [ 1.77550086]] 使用lambda函数f=lambda x:x如果(x>0)其他(x*0.01) 错误是ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all() 我在stackoverflow.com上搜索了不同的主题,但没有找到任何令人满意的问题解释和适合我的案例(许多对和运算符、矢量化代码等的不清楚引用)

目前,我在处理numpy.array-4x1-e

[[-1.96113883]
 [-3.46144244]
 [ 5.075857  ]
 [ 1.77550086]]
使用lambda函数
f=lambda x:x如果(x>0)其他(x*0.01)

错误是
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

我在stackoverflow.com上搜索了不同的主题,但没有找到任何令人满意的问题解释和适合我的案例(许多对
运算符、矢量化代码等的不清楚引用)

在处理数组之后,我期望的是一个与输入1维度相同的数组,并且每个值都根据函数进行了修改,例如:

[[-0.0196113883]
 [-0.0346144244]
 [ 5.075857  ]
 [ 1.77550086]]

最后,有人能为我提供一个解决方案,并解释为什么会发生这个错误。谢谢您的建议。

x>0
将对整个numpy数组进行评估,并返回另一个布尔数组。但是,
if
语句将整个数组作为单个操作进行计算

arr = np.array([[-1.96113883],
                [-3.46144244],
                [ 5.075857  ],
                [ 1.77550086]])
print arr > 0
   [[False]
    [False]
    [ True]
    [ True]]
如错误消息中所述,布尔数组的真值是模糊的

相反,正如ajcr在评论中指出的那样,对于向量化的
if-else
语句,应该使用
np.where

例如


为什么不直接使用理解列表:

np.array([list(i*0.01) if i>0 else list(i) for i in arr])

Out[28]: 
array([[-1.96113883],
       [-3.46144244],
       [ 0.05075857],
       [ 0.01775501]])
数据

arr = np.array([[-1.96113883],
 [-3.46144244],
 [ 5.075857  ],
 [ 1.77550086]])

您试图将lambda函数应用于整个数组,但您希望将其应用于每个元素。有更多的numpy-y解决方案。将数组设为
a
并将
numpy
作为
np
导入。您可以使用奇特的索引:

>>> a_leq_0 = a <= 0
>>> a[a_leq_0] = a[a_leq_0]*0.01
>>> a
array([[-0.01961139],
       [-0.03461442],
       [ 5.075857  ],
       [ 1.77550086]])
解释见
的文档,其中

>>> np.where(a > 0, a, a*0.01)
array([[-0.01961139],
       [-0.03461442],
       [ 5.075857  ],
       [ 1.77550086]])
其中(条件[x,y])
[…]
如果同时指定了
x
y
,则输出数组包含
x
的元素,其中
条件
为真,以及
y
其他地方


对于矢量化的if/else操作,尝试使用
np.where
,例如
np.where(arr>0,arr,arr*0.01)
是最快/最佳的做法。感谢您的改进。我已经相应地更新了我的答案。谢谢你的建议。我尝试了
np.vectorize
,效果很好。然而,使用
np.vectorize
np.where
(当然后者的使用与
if else
)这一事实具体相关)的利与弊是什么?如果我必须使用其他函数处理数组的元素,您会提出什么建议?
np.vectorize
更通用,可以用作
map
,但在numpy数组中使用。但是,它确实为每个元素使用了一个额外的函数调用,这在
np的情况下是可以避免的。其中
。这会产生一个numpy数组的python列表,但不满足要求。现在它会产生一个列表列表,但仍然不满足要求。你需要再次把所有的东西都投回数组。我没有否决你的回答,事实上我还没有获得投票的机会。无论如何,谢谢你的建议。
>>> np.where(a > 0, a, a*0.01)
array([[-0.01961139],
       [-0.03461442],
       [ 5.075857  ],
       [ 1.77550086]])