Python 如何获得掩码,反转numpy.flatnonzero?
给定任意一维遮罩:Python 如何获得掩码,反转numpy.flatnonzero?,python,numpy,ipython,Python,Numpy,Ipython,给定任意一维遮罩: In [1]: import numpy as np ...: mask = np.array(np.random.random_integers(0,1,20), dtype=bool) ...: mask Out[1]: array([ True, False, True, False, False, True, False, True, True, False, True, False, True, False, False,
In [1]: import numpy as np
...: mask = np.array(np.random.random_integers(0,1,20), dtype=bool)
...: mask
Out[1]:
array([ True, False, True, False, False, True, False, True, True,
False, True, False, True, False, False, True, True, False,
True, True], dtype=bool)
我们可以使用np.flatnonzero
获得mask
的True
元素数组:
In[2]: np.flatnonzero(mask)
Out[2]: array([ 0, 2, 5, 7, 8, 10, 12, 15, 16, 18, 19], dtype=int64)
但是现在我如何反转这个过程,从
\u 2
转到掩码?创建一个全假掩码,然后使用numpy为掩码分配True
条目
In[3]: new_mask = np.zeros(20, dtype=bool)
...: new_mask
Out[3]:
array([False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False], dtype=bool)
In[4]: new_mask[_2] = True
...: new_mask
Out[4]:
array([ True, False, True, False, False, True, False, True, True,
False, True, False, True, False, False, True, True, False,
True, True], dtype=bool)
作为检查,我们看到:
In[5]: np.flatnonzero(new_mask)
Out[5]: array([ 0, 2, 5, 7, 8, 10, 12, 15, 16, 18, 19], dtype=int64)
正如所料,\u 5==\u 2
:
In[6]: np.all(_5 == _2)
Out[6]: True
您可以使用
np.bincount
:
In [304]: mask = np.random.binomial(1, 0.5, size=10).astype(bool); mask
Out[304]: array([ True, True, False, True, False, False, False, True, False, True], dtype=bool)
In [305]: idx = np.flatnonzero(mask); idx
Out[305]: array([0, 1, 3, 7, 9])
In [306]: np.bincount(idx, minlength=len(mask)).astype(bool)
Out[306]: array([ True, True, False, True, False, False, False, True, False, True], dtype=bool)
这感觉像是(稍微)更快的方法。还有一点更直观。