我有2个数组,
mat = np.array(
[
[[0,0],[0,1],[0,2]],
[[1,0],[1,1],[1,2]],
[[2,0],[2,1],[2,2]]
]
)
mat2 = np.array(
[
[[0,1],[0,1],[0,2]],
[[1,0],[1,1],[1,2]],
[[2,0],[2,2],[2,2]]
]
)
我想找到第2轴上在mat
和mat2
中都相同的所有数组,并将它们变成零数组。换句话说,如果每个数组mat
和mat2
都是RGB图像,我想找到具有相同R,G,B值的像素,并返回具有设置为(0 ,0,0),其余像素保持不变。
所以我试图通过上述数组实现的输出是这样:
[
[[0, 1], [0, 0], [0, 0]],
[[0, 0], [0, 0], [0, 0]],
[[0, 0], [2, 2], [0, 0]]
]
我尝试了以下代码:
operated = np.where((mat2-mat==0).all(axis=2), np.array([0,0]), mat2)
但是它会说:
ValueError: operands could not be broadcast together with shapes (3,3) (2,) (3,3,2)
我认为这是因为它仅对轴2中的每个数组返回一个True
或False
,如果像素相同,则应返回(True , True)
,如果相减则应返回(False, False)
不应该做。
答案 0 :(得分:2)
您可以根据以下条件使用np.where
替换数组中的值:
np.where((mat == mat2).all(axis=2, keepdims=True), [0,0], mat2)
array([[[0, 1],
[0, 0],
[0, 0]],
[[0, 0],
[0, 0],
[0, 0]],
[[0, 0],
[2, 2],
[0, 0]]])
(mat == mat2).all(axis=2, keepdims=True)
处:
array([[[False],
[ True],
[ True]],
[[ True],
[ True],
[ True]],
[[ True],
[False],
[ True]]])
返回与mat
相同尺寸的蒙版,您可以将其用作np.where
的条件。然后,您只需根据结果指定是用[0,0]
还是用mat2
替换这些值。