【问题标题】:mask a 2D numpy array based on values in one column根据一列中的值屏蔽 2D numpy 数组
【发布时间】:2011-06-05 06:35:02
【问题描述】:

假设我有以下 numpy 数组:

a = [[1, 5, 6],
     [2, 4, 1],
     [3, 1, 5]]

我想屏蔽第一列中包含1 的所有行。也就是说,我想要

   [[--, --, --],
     [2, 4, 1],
     [3, 1, 5]]

使用 numpy 掩码数组操作可以做到这一点吗?怎么可能?

谢谢。

【问题讨论】:

    标签: python arrays numpy mask


    【解决方案1】:
    import numpy as np
    
    a = np.array([[1, 5, 6],
                  [2, 4, 1],
                  [3, 1, 5]])
    
    np.ma.MaskedArray(a, mask=(np.ones_like(a)*(a[:,0]==1)).T)
    
    # Returns: 
    masked_array(data =
     [[-- -- --]
     [2 4 1]
     [3 1 5]],
                 mask =
     [[ True  True  True]
     [False False False]
     [False False False]])
    

    【讨论】:

      【解决方案2】:

      您可以通过

      创建所需的掩码
      mask = numpy.repeat(a[:,0]==1, a.shape[1])
      

      和被屏蔽的数组

      masked_a = numpy.ma.array(a, mask=numpy.repeat(a[:,0]==1, a.shape[1]))
      

      【讨论】:

      • 感谢斯文的回复!我是 numpy 新手,不知道重复方法。会查的。
      【解决方案3】:

      您可以简单地创建一个空掩码,然后使用 numpy-broadcasting(如 @eumiro 所示)但使用元素和按位“或”运算符|

      >>> a = np.array([[1, 5, 6], [2, 4, 1], [3, 1, 5]])
      
      >>> mask = np.zeros(a.shape, bool) | (a[:, 0] == 1)[:, None]
      
      >>> np.ma.array(a, mask=mask)
      masked_array(data =
       [[-- -- --]
       [2 4 1]
       [3 1 5]],
                   mask =
       [[ True  True  True]
       [False False False]
       [False False False]],
             fill_value = 999999)
      

      进一步解释:

      >>> # select first column
      >>> a[:, 0]  
      array([1, 2, 3])
      
      >>> # where the first column is 1
      >>> a[:, 0] == 1  
      array([ True, False, False], dtype=bool)
      
      >>> # added dimension so that it correctly broadcasts to the empty mask
      >>> (a[:, 0] == 1)[:, None]  
      array([[ True],
             [False],
             [False]], dtype=bool)
      
      >>> # create the final mask
      >>> np.zeros(a.shape, bool) | (a[:, 0] == 1)[:, None]  
      array([[ True,  True,  True],
             [False, False, False],
             [False, False, False]], dtype=bool)
      

      这种方法的另一个优点是它不需要使用潜在的昂贵乘法或np.repeat,因此它应该非常快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2021-08-30
        • 2019-09-29
        • 1970-01-01
        相关资源
        最近更新 更多