【问题标题】:Ternary operator on arrays in pythonpython中数组的三元运算符
【发布时间】:2015-03-29 07:01:14
【问题描述】:

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

if true then a else b

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

这是我正在尝试的:

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

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

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

【问题讨论】:

    标签: python arrays


    【解决方案1】:

    使用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 个值匹配怎么办?要比较数组,您应该分别使用位运算符 &amp;|~ 来表示 andornot

    np.where 为真时使用布尔条件分配第二个参数中的值,否则分配第三个参数,参见docs

    【讨论】:

      【解决方案2】:

      在你的表达中:

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

      您正在尝试将标量与向量进行比较,因此它不太可能工作。

      您真正想要的是使用map() 对数组的每个元素进行检查:

      map(lambda x: x if x <= 255 else 255, imfinal[:,:,1])
      

      【讨论】:

      • 看起来 map 的工作原理很像点函数。我很好奇在比较标量和向量时它是否会起作用,因为这种类型的某些操作是可能的,例如imfinal = 1 * (imfinal
      【解决方案3】:

      虽然其他答案很好地涵盖了一般情况,但在您的情况下,最好的解决方案可能是使用 numpy.minimum 为您扩展标量:

      imfinal[:,:,1] = numpy.minimum(imfinal[:,:,1], 255)
      

      【讨论】:

      • 也许你的意思是分钟。 OP 希望 255 成为结果数组中的最大值,而不是最小值。
      • 这引入了我之前遇到的同样的问题
      【解决方案4】:

      作为np.where 的替代方法

      mask = imfinal[:,:,1] > 255
      imfinal[:,:,1][mask] = 255
      

      或者针对这种特定情况(假设允许的最小值为 0)。

      np.clip(imfinal[:,:,1], 0, 255, out=imfinal[:,:,1]) 
      

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 2012-04-02
        • 2011-05-05
        • 2012-08-08
        • 1970-01-01
        相关资源
        最近更新 更多