按条件更新numpy数组行

按条件更新numpy数组行,numpy,Numpy,我需要帮助)我有NumPy阵列: False False False False False True True False True True True True False True True False False False False False 我如何获得该值(取第一行和最后一行,其中包含True,并将所有元素设置为False) 工作原理: In [19]: arr Out[19]: array([[False, False, False, False],

我需要帮助)我有NumPy阵列:

False False False False
False True  True  False
True  True  True  True
False True  True  False
False False False False
我如何获得该值(取第一行和最后一行,其中包含True,并将所有元素设置为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)
In [22]: arr.any(axis=1).nonzero()[0][[0,-1]]
Out[22]: array([1, 3])
nonzero
返回
True
行的索引元组(每个轴一项):

In [21]: arr.any(axis=1).nonzero()
Out[21]: (array([1, 2, 3]),)
我们可以使用索引查找包含
True
值的第一行和最后一行的索引:

In [20]: arr.any(axis=1)
Out[20]: array([False,  True,  True,  True, False], dtype=bool)
In [22]: arr.any(axis=1).nonzero()[0][[0,-1]]
Out[22]: array([1, 3])
最后,我们可以使用

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)
工作原理:

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)
In [22]: arr.any(axis=1).nonzero()[0][[0,-1]]
Out[22]: array([1, 3])
nonzero
返回
True
行的索引元组(每个轴一项):

In [21]: arr.any(axis=1).nonzero()
Out[21]: (array([1, 2, 3]),)
我们可以使用索引查找包含
True
值的第一行和最后一行的索引:

In [20]: arr.any(axis=1)
Out[20]: array([False,  True,  True,  True, False], dtype=bool)
In [22]: arr.any(axis=1).nonzero()[0][[0,-1]]
Out[22]: array([1, 3])
最后,我们可以使用

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)
如果你的意思是“第一个和最后一个”只是指特定的例子

如果包含
True
False
值的每一行都应设置为
False
,则不应限制为这些行中的“第一行和最后一行”,而且解决方法更简单。使用
~a.all(1)
将告诉您哪些行不是全部
True
,您可以使用以下命令将这些行设置为
False

arr[~arr.all(1)] = False
或者,为了避免将完全
False
的行冗余设置为
False
,请使用异或,
^

arr[arr.any(1) ^ arr.all(1)] = False
在某些情况下,这会更快。

如果您仅指特定示例中的“第一个和最后一个”

如果包含
True
False
值的每一行都应设置为
False
,则不应限制为这些行中的“第一行和最后一行”,而且解决方法更简单。使用
~a.all(1)
将告诉您哪些行不是全部
True
,您可以使用以下命令将这些行设置为
False

arr[~arr.all(1)] = False
或者,为了避免将完全
False
的行冗余设置为
False
,请使用异或,
^

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

在某些情况下,哪一种会更快。

@erthalion这是否一般地回答了这个问题?我将问题解释为:如果一行同时具有
True
False
值,则将所有值设置为
False
。不仅仅是符合该条件的第一行和最后一行。如果两行以上符合该条件,则此答案会遗漏一些。我会这样做:
arr[~a.all(1)]=False
@askewchan:是的,在我的问题中,我只考虑了第一行/最后一行。@erthalion这个问题大体上回答了这个问题吗?我将问题解释为:如果一行同时具有
True
False
值,则将所有值设置为
False
。不仅仅是符合该条件的第一行和最后一行。如果两行以上符合该条件,则此答案会遗漏一些。我会这样做:
arr[~a.all(1)]=False
@askewchan:是的,在我的问题中,我只考虑了第一行/最后一行。