2

我需要帮助)我有 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
4

2 回答 2

4
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)
于 2013-09-15T09:14:44.567 回答
1

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

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

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

或者,为了避免将行完全设置FalseFalse,请使用互斥或​​ , ^

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

在某些情况下会更快。

于 2013-09-15T17:18:05.083 回答