识别并替换ndarray中的行

时间:2014-03-23 05:01:14

标签: python arrays numpy

这类似于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,因为它们是相同的基础计算值。)

1 个答案:

答案 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.        ]]])