识别并替换ndarray中的行

2 投票
1 回答
701 浏览
提问于 2025-04-17 23:29

这个问题跟这个问题有点像,不过我有一个更严格的要求:我需要替换整行的出现,而不仅仅是列中可能存在的值。第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.        ]]])

撰写回答