按条件更新numpy数组行

时间:2013-09-15 09:06:33

标签: numpy

我需要帮助)我有NumPy数组:

False False False False
False True  True  False
True  True  True  True
False True  True  False
False False False False

如何获取此信息(包含 True 的第一行和最后一行,并将所有元素设置为 False )?

False False False False
False False False  False
True  True  True  True
False False False  False
False False False False

2 个答案:

答案 0 :(得分:3)

arr[arr.any(axis=1).nonzero()[0][[0,-1]]] = False

工作原理:

In [19]: arr

Out[19]: 
array([[False, False, False, False],
       [False,  True,  True, False],
       [ True,  True,  True,  True],
       [False,  True,  True, False],
       [False, False, False, False]], dtype=bool)

arr.any(axis=1)查找哪些行包含True值:

In [20]: arr.any(axis=1)
Out[20]: array([False,  True,  True,  True, False], dtype=bool)

nonzero返回True行索引的元组(每个轴一项):

In [21]: arr.any(axis=1).nonzero()
Out[21]: (array([1, 2, 3]),)

我们可以使用索引来查找包含True值的第一行和最后一行的索引:

In [22]: arr.any(axis=1).nonzero()[0][[0,-1]]
Out[22]: array([1, 3])

最后,我们可以使用

将这些行设置为False
In [23]: arr[arr.any(axis=1).nonzero()[0][[0,-1]]] = False

In [24]: arr
Out[24]: 
array([[False, False, False, False],
       [False, False, False, False],
       [ True,  True,  True,  True],
       [False, False, False, False],
       [False, False, False, False]], dtype=bool)

答案 1 :(得分:1)

如果您仅在参考特定示例时表示“第一个和最后一个”......

如果包含TrueFalse值的每一行都应设置为False,那么您不应该限制这些行的“第一个和最后一个”,并且解决方案要容易得多。使用~a.all(1)将告诉您哪些行所有True的事实,您可以使用以下内容将这些行设置为False

arr[~arr.all(1)] = False

或者,为了避免将完全False的行冗余设置为False,请使用 exclusive或^

arr[arr.any(1) ^ arr.all(1)] = False

在某些情况下会更快。