Python Numpy比较两个3d阵列并找到相同的阵列
我有两个数组Python Numpy比较两个3d阵列并找到相同的阵列,python,arrays,numpy,Python,Arrays,Numpy,我有两个数组 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中ma
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)
。您可以根据以下条件替换数组中的值:
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)。全部(axis=2,keepdims=True)
:
返回与mat
尺寸相同的掩码,可以将其用作np.where
的条件。然后,您只需根据结果指定是用[0,0]
替换这些值还是用mat2
替换这些值。您可以根据以下条件替换数组中的值:
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)。全部(axis=2,keepdims=True)
:
返回与
mat
尺寸相同的掩码,可以将其用作np.where
的条件。然后您只需根据结果指定是用[0,0]
还是用mat2
替换这些值。不应该是[[0,1]、[0,0]、[0,0]、[0,0]、[0,0]、[0,0]、[0,0]、[0,0]、[0,0]、[0,0]、[[0,0]、[2,2]、[0,0]]]
?具体来说,第一行输出看起来是错误的。@Divakar这是一个输入错误,对不起。已修复。请将keepdims=True
与.all()
@Divakar一起使用。很抱歉,我对numpy还是新手,所以我不确定到底需要做什么。你能详细说明或包含代码吗?谷歌搜索文档-numpy.all()
。那不应该是[[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[2,2],[0,0]].
?具体来说,第一行输出看起来是错误的。@Divakar这是一个输入错误,对不起。已修复。请将keepdims=True
与.all()
@Divakar一起使用。很抱歉,我对numpy还是新手,所以我不确定到底需要做什么。你能详细说明或包含代码吗?谷歌搜索文档-numpy.all()
。只有在数组轴2中第一项的减法在特定范围内时,才能进行减法吗?嗯,你能给我举个例子吗?你的意思是替换而不是减右?例如,3
对于最后一个维度中的每个元素?感谢您的努力。只有在数组轴2中第一个项目的减法在特定范围内时才能进行减法吗?嗯,您能给我举个例子吗?您的意思是替换而不是减法对吗?例如,3
?谢谢您的努力。