识别并替换ndarray中的行
这个问题跟这个问题有点像,不过我有一个更严格的要求:我需要替换整行的出现,而不仅仅是列中可能存在的值。第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. ]]])
你可以看到,布尔掩码是按列替换所有出现的值。有没有办法修改这个布尔掩码,或者修改它所用来选择的数组,让它只替换那些在所有三列中都与搜索数组的值匹配的行呢?
(顺便提一下,虽然我的数据是float64类型,但我寻找的所有“匹配”出现都在np.all()中返回True,因为它们是相同的基础计算值。)
1 个回答
3
你可以创建一个“面具”,用来标识在所有列中条件满足的地方:
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. ]]])