代码之家  ›  专栏  ›  技术社区  ›  G F

如何基于numpy数组中的条件删除行?

  •  7
  • G F  · 技术社区  · 7 年前

    从以下阵列:

    test = np.array([[1,2,'a'],[4,5,6],[7,'a',9],[10,11,12]])
    

    如何删除包含“a”的行? 预期结果:

    array([[ 4,  5,  6],
       [10, 11, 12]])
    
    3 回复  |  直到 7 年前
        1
  •  11
  •   juanpa.arrivillaga    7 年前

    笔记 numpy 支持矢量化比较:

    >>> test
    array([[1, 2, 'a'],
           [4, 5, 6],
           [7, 'a', 9],
           [10, 11, 12]], dtype=object)
    >>> test == 'a'
    array([[False, False,  True],
           [False, False, False],
           [False,  True, False],
           [False, False, False]], dtype=bool)
    

    现在,你想要 哪里 全部的 不等于 'a' :

    >>> (test != 'a').all(axis=1)
    array([False,  True, False,  True], dtype=bool)
    

    因此,只需使用掩码选择行:

    >>> row_mask = (test != 'a').all(axis=1)
    >>> test[row_mask,:]
    array([[4, 5, 6],
           [10, 11, 12]], dtype=object)
    
        2
  •  3
  •   kmario23 Mazdak    7 年前

    还有,也许像这样?(灵感来源于 another answers )

    In [100]: mask = ~(test == 'a')
    
    In [101]: mask
    Out[101]: 
    array([[ True,  True, False],
           [ True,  True,  True],
           [ True, False,  True],
           [ True,  True,  True]], dtype=bool)
    
    In [102]: test[np.all(mask, axis=1), :]
    Out[102]: 
    array([['4', '5', '6'],
           ['10', '11', '12']],
          dtype='<U21')
    

    但是,请注意,我们在这里 正在删除 原始数组中的任何行。我们只是把没有字母表的行切掉 a .

        3
  •  2
  •   G F    7 年前

    总之,有几种可能的方法,例如:

    test[np.all(test != 'a', axis=1), :]
    

    test[(test != 'a').all(axis=1)]