这类似于this问题,除了我有一个更严格的条件:我需要替换整行的出现,而不仅仅是列中其他地方可能存在的值。第368行应该让我们知道迄今为止有多少花哨指数实验失败了:
In [368]:
a=np.array([[[ 42.30803907, 0. , 0. ],
[ 42.30803907, 3.0052592 , 0. ]],
[[ 42.30803907, 3.0052592 , 0. ],
[ 40.54907736, 5.44198582, 0. ]],
[[ 40.54907736, 5.44198582, 0. ],
[ 42.14713681, 8.84169967, 0. ]]])
In [369]:
toBeReplaced=np.array([ 42.30803907, 3.0052592 , 0. ])
In [370]:
b=a==toBeReplaced
#b returns:
#array([[[ True, False, True],
# [ True, True, True]],
#
# [[ True, True, True],
# [False, False, True]],
#
# [[False, False, True],
# [False, False, True]]], dtype=bool)
这里我似乎无法正确使用条件语法:
a=np.where(b==[True,True,True], [9,9,9], a)
Out[373]:
array([[[ 9. , 0. , 9. ],
[ 9. , 9. , 9. ]],
[[ 9. , 9. , 9. ],
[ 40.54907736, 5.44198582, 9. ]],
[[ 40.54907736, 5.44198582, 9. ],
[ 42.14713681, 8.84169967, 9. ]]])
您可以看到布尔掩码替换了基于列的所有匹配项。有没有办法改变布尔掩码或用作选择器的数组,以便只有所有三列中的值与搜索数组的列匹配的行?
(N.B。我还应该注意,尽管我的数据是float64,但我正在寻找的所有“匹配”事件在np.all()上返回True,因为它们是相同的基础计算值。)
答案 0 :(得分:2)
您可以创建一个掩码,标识所有列中条件的满足位置:
mask = np.all(a==[42.30803907, 3.0052592, 0.], axis=2)
a[mask] = [9, 9, 9]
#array([[[ 42.30803907, 0. , 0. ],
# [ 9. , 9. , 9. ]],
#
# [[ 9. , 9. , 9. ],
# [ 40.54907736, 5.44198582, 0. ]],
#
# [[ 40.54907736, 5.44198582, 0. ],
# [ 42.14713681, 8.84169967, 0. ]]])