【问题标题】:How do I obtain a mask, reversing numpy.flatnonzero?如何获得掩码,反转 numpy.flatnonzero?
【发布时间】:2015-08-13 21:35:15
【问题描述】:

给定一个任意一维掩码:

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获取maskTrue元素的数组:

In[2]: np.flatnonzero(mask)
Out[2]: array([ 0,  2,  5,  7,  8, 10, 12, 15, 16, 18, 19], dtype=int64)

但是现在我该如何扭转这个过程并从 _2 转到掩码?

【问题讨论】:

    标签: python numpy ipython


    【解决方案1】:

    创建一个全假掩码,然后使用 numpy 的 index array functionality 为掩码分配 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)
    

    正如所料,_5 == _2

    In[6]: np.all(_5 == _2)
    Out[6]: True
    

    【讨论】:

    • 这感觉像是(稍微)更快的方法。也更直观一点。
    【解决方案2】:

    你可以使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2019-07-04
      • 2019-05-23
      • 2022-10-18
      • 2017-01-22
      • 2014-09-08
      相关资源
      最近更新 更多