Skip to main content
 首页 » 编程设计

python之numpy 有条件地用数组替换标量/ bool 值

2025年05月04日10thcjp

我有一个 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 向导)我设法以 pythonic 方式实现 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: shape mismatch: objects cannot be breascast to a single shape

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

请您参考如下方法:

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

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)