【问题标题】:numpy conditionally replace scalar/boolean with arraynumpy 有条件地用数组替换标量/布尔值
【发布时间】:2014-01-09 07:14:21
【问题描述】:

我有一个 3D 数组 (x, y, RGBA),我的目标是:

找出哪些像素是空白的 RGBA=[0,0,0,0],然后将它们的颜色更改为蓝色,并将其他像素的颜色更改为绿色。

据我所知,它可以分两步完成:

1- 创建一个 500x500 数组,如果像素有值,则布尔值为 True,如果为空白,则为 False

2- 然后应用一个函数将 True 替换为 [0,0,255,255] 并将 False 替换为 [0,255,0, 255]

经过多次搜索(我不是 Python 向导),我设法以 Python 的方式实现了 1-(至少我的希望......)

img.shape
>(500, 500, 4)
img_bool = np.equal(img[:,:], [0, 0, 0, 0]).all(axis=2)
img_bool.shape
>(500, 500)

我对第 2 步的猜测是尝试这样的语法:

img_final = np.where(img_bool, [0,0,255,255], [0,255,0,255])

np.choose(img_bool, [[0,0,255,255],[0,255,0,255], out=img_final)

但它们给出了相同的错误(非常合乎逻辑,因为两个表达式实际上可能做同样的事情)

ValueError:形状不匹配:对象不能被转换为单个形状

事实上,第 2 步可以总结为“如何用 numpy.ndarray 中的数组/向量替换标量/布尔值?”

【问题讨论】:

    标签: python arrays image numpy


    【解决方案1】:

    对于您的第一个任务,使用颜色是正整数这一事实,您可以使用

    img_bool = img.sum(axis=2)>0
    

    你可以做的第二个

    img[img_bool] = [0, 0, 255, 255]
    img[~img_bool] = [0, 255, 0, 255]
    

    请注意,如果我的描述正确,您将原始表达式返回反向,即您必须将其更改为

    img_bool = ~np.equal(img[:,:], [0, 0, 0, 0]).all(axis=2)
    

    【讨论】:

    • 非常简洁的语法。 thx,你所有的答案都很完美。只有一句话:如果像素数组为 [0, -15, 15, 0] 否, img.sum(axis=2)>0 可以返回 True 吗?但在我的情况下,它工作得很好,因为所有的价值观都是积极的。再次感谢。
    • @comte 是的,可以,我添加了说明。我从等于 255 的值判断,你的颜色是积极的。
    猜你喜欢
    • 2018-11-06
    • 2014-12-20
    • 1970-01-01
    • 2012-06-16
    • 2012-05-01
    • 2021-10-15
    • 2017-07-19
    • 2019-01-17
    • 1970-01-01
    相关资源
    最近更新 更多