Python 将lambda表达式应用于数组元素时发生ValueError
目前,我在处理numpy.array-4x1-ePython 将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上搜索了不同的主题,但没有找到任何令人满意的问题解释和适合我的案例(许多对和运算符、矢量化代码等的不清楚引用)
[[-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]])