按条件更新numpy数组行
我需要帮助)我有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],
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:是的,在我的问题中,我只考虑了第一行/最后一行。