我正在尝试在python中对数组执行以下操作:
if true then a else b
我正在尝试在图像的一个通道上执行它。基本上我想检查一个值是否大于255,如果是,返回255否则返回正在检查的值。
这是我正在尝试的:
imfinal[:,:,1] = imfinal[:,:,1] if imfinal[:,:,1] <= 255 else 255
我收到以下错误: ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()
有没有更好的方法来执行此操作?
答案 0 :(得分:5)
使用np.where
:
imfinal[:,:,1] = np.where(imfinal[:,:,1] <= 255, imfinal[:,:,1], 255)
至于为何您收到该错误,请参阅:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()。
使用and
,or
比较数组时,基本上它变得模棱两可,因为如果数组中的1个值匹配怎么办?要比较数组,您应该分别对&
,|
,~
使用按位运算符and
,or
,not
。
np.where
使用布尔条件在true时分配第二个参数中的值,否则分配第3个参数,请参阅docs
答案 1 :(得分:2)
:
if imfinal[:,:,1] <= 255
你试图将标量与向量进行比较,因此不太可能有效。
您真正想要的是使用map()
来检查数组的每个元素:
map(lambda x: x if x <= 255 else 255, imfinal[:,:,1])
答案 2 :(得分:2)
虽然其他答案很好地涵盖了一般情况,但在您的情况下,最佳解决方案可能是使用numpy.minimum
为您扩展标量:
imfinal[:,:,1] = numpy.minimum(imfinal[:,:,1], 255)
答案 3 :(得分:0)
替代使用np.where
mask = imfinal[:,:,1] > 255
imfinal[:,:,1][mask] = 255
或者针对这种特殊情况(假设允许的最小值为0)。
np.clip(imfinal[:,:,1], 0, 255, out=imfinal[:,:,1])