向量而不是元素的 Numpy 条件

Numpy condition on a vector rather than an element

我有一个表示图像的 numpy 数组,它的尺寸是 (w, h, 4),4 是 RGBA。现在我想用透明像素替换所有白色像素。我希望我可以做类似 np.where(pic == np.array([255, 255, 255, 255]), np.array([0, 0, 0, 0]), pic) 的事情,但这个确切的代码显然不起作用:pic == somethingpic 的每个元素与 something 进行比较,所以我将得到一个 (w, h, 4) False-s 数组。有条件地不仅替换一个元素而且替换 numpy 数组中的整个向量的规范方法是什么?

您可以像这样简单地使用 np.all()

old = [255, 255, 255, 255]
new = [0, 0, 0, 0]

# pic is your (w, h, 4) shaped array
pic[np.all(pic == old, axis = -1)] = new

这里 pic == old 仍然给你一个 (w, h, 4) 维布尔 numpy 数组,但是沿着最里面的轴 (-1) ANDing 将它减少到 (w, h) 形状,其中每个 [i, j] location 是 True 还是 False 取决于原始 RGBA 值是否等于 old.

pic[np.all(pic[: , : , : ] == 255, axis=-1), :] = 0

除了 0 你还可以给它一个像 np.arange(pic.shape[-1])

这样的数组

代替第四个 : 你可以给出你想要的最后一个维度的任何数字,因为你想替换最后一个轴上的所有元素,我插入了 :。例如,如果您只想更改那些点的透明度,您可以这样写:

pic[np.all(pic[: , : , : ] == 255, axis=-1), 4] = 0

所以通过这个你实际上只是让那些白点透明,而不是让它们变成透明的黑色。