向量而不是元素的 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 == something
将 pic
的每个元素与 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
所以通过这个你实际上只是让那些白点透明,而不是让它们变成透明的黑色。
我有一个表示图像的 numpy 数组,它的尺寸是 (w, h, 4)
,4 是 RGBA。现在我想用透明像素替换所有白色像素。我希望我可以做类似 np.where(pic == np.array([255, 255, 255, 255]), np.array([0, 0, 0, 0]), pic)
的事情,但这个确切的代码显然不起作用:pic == something
将 pic
的每个元素与 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
所以通过这个你实际上只是让那些白点透明,而不是让它们变成透明的黑色。