将 lambda 表达式应用于数组元素时出现 ValueError
ValueError while applying lambda expression to elements of an array
目前我在处理 numpy.array - 4x1 - 即
时遇到错误
[[-1.96113883]
[-3.46144244]
[ 5.075857 ]
[ 1.77550086]]
使用 lambda 函数 f = lambda x: x if (x > 0) else (x * 0.01)
。
错误是ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
。
我在 whosebug.com 上搜索了不同的主题,但没有找到任何令人满意的问题解释和适合我的案例(许多对 and
运算符的不明确引用,向量化代码等)。
处理数组后,我期望的是一个与输入数组具有相同维度的数组,并且每个值都根据函数进行了修改,例如:
[[-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 在评论中指出的那样,您应该使用 np.where
作为矢量化 if-else
语句
例如
np.where(arr > 0, arr, arr*0.01)
array([[-0.01961139],
[-0.03461442],
[ 5.075857 ],
[ 1.77550086]])
为什么不直接使用理解列表:
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
:
>>> np.where(a > 0, a, a*0.01)
array([[-0.01961139],
[-0.03461442],
[ 5.075857 ],
[ 1.77550086]])
解释在where
的文档中:
where(condition, [x, y])
[...]
If both x
and y
are specified, the output array contains elements of x
where condition
is True, and elements from
y
elsewhere.
目前我在处理 numpy.array - 4x1 - 即
时遇到错误[[-1.96113883]
[-3.46144244]
[ 5.075857 ]
[ 1.77550086]]
使用 lambda 函数 f = lambda x: x if (x > 0) else (x * 0.01)
。
错误是ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
。
我在 whosebug.com 上搜索了不同的主题,但没有找到任何令人满意的问题解释和适合我的案例(许多对 and
运算符的不明确引用,向量化代码等)。
处理数组后,我期望的是一个与输入数组具有相同维度的数组,并且每个值都根据函数进行了修改,例如:
[[-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 在评论中指出的那样,您应该使用 np.where
作为矢量化 if-else
语句
例如
np.where(arr > 0, arr, arr*0.01)
array([[-0.01961139],
[-0.03461442],
[ 5.075857 ],
[ 1.77550086]])
为什么不直接使用理解列表:
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
:
>>> np.where(a > 0, a, a*0.01)
array([[-0.01961139],
[-0.03461442],
[ 5.075857 ],
[ 1.77550086]])
解释在where
的文档中:
where(condition, [x, y])
[...]
If bothx
andy
are specified, the output array contains elements ofx
wherecondition
is True, and elements fromy
elsewhere.