python中阵列上的三元运算符

时间:2015-03-28 22:15:56

标签: python arrays

我正在尝试在python中对数组执行以下操作:

if true then a else b

我正在尝试在图像的一个通道上执行它。基本上我想检查一个值是否大于255,如果是,返回255否则返回正在检查的值。

这是我正在尝试的:

imfinal[:,:,1] = imfinal[:,:,1] if imfinal[:,:,1] <= 255 else 255

我收到以下错误: ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

有没有更好的方法来执行此操作?

4 个答案:

答案 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()

使用andor比较数组时,基本上它变得模棱两可,因为如果数组中的1个值匹配怎么办?要比较数组,您应该分别对&|~使用按位运算符andornot

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])