【问题标题】:Delete columns from numpy array depending on a condition on a single cell根据单个单元格上的条件从 numpy 数组中删除列
【发布时间】:2014-01-09 09:49:25
【问题描述】:

首先,对不起我的英语不好。

我有这个数组t

array([[ 0,  1,  2,  0,  4,  5,  6,  7,  8,  9],
       [ 0, 11,  0, 13,  0, 15,  0, 17, 18,  0]])

我想删除第二行值为空的列。在这里,我想删除第 0、2、4、6 和 9 列,得到这个数组:

array([[  1,   0,   5,   7,  8 ],
       [ 11,  13,  15,  17, 18 ]])

我尝试使用np.sum(),但没有成功。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    与 Juh_ 类似,但更具表现力,并避免了一些次要的不必要的性能开销。总共 12 个高度 Pythonic、明确和明确的字符。这真的是 numpy 101;如果您仍然想解决这个问题,您可以通过阅读 numpy 入门书来帮自己一个忙。

    import numpy as np
    a = np.array([[ 0,  1,  2,  0,  4,  5,  6,  7,  8,  9],
                  [ 0, 11,  0, 13,  0, 15,  0, 17, 18,  0]])
    print a[:,a[1]!=0]
    

    【讨论】:

      【解决方案2】:

      numpy.delete:

      a = np.array([[0, 1, 2, 0, 4, 5, 6, 7, 8, 9], [0, 11, 0, 13, 0, 15, 0, 17, 18, 0]])
      
      indices = [i for (i,v) in enumerate(a[1]) if v==0]
      # [0, 2, 4, 6, 9]
      
      a = np.delete(a, indices, 1)
      # array([[ 1,  0,  5,  7,  8], [11, 13, 15, 17, 18]])
      

      【讨论】:

      • 这是一个高度非numpythonic的解决方案。它取消了 numpy 的要点之一,将循环从 python 移动到 C 级别
      • 如果你关心性能的话。我使用 numpy 的主要原因是为了方便。但我同意有更好的解决方案。
      • 赞成以平衡 Eelco 不必要的反对票。这很有用,即使它不是最好的。
      • 赞成,因为这是唯一真正做到了 OP 想要的答案 - 从他们的数组中删除数据。是的,使用 strides/indexes 来获取仅包含您想要的数据的视图很不错 - 但有时您只需要删除一行。
      【解决方案3】:

      简单(完全 numpy)解决方案:

      import numpy as np
      
      t = np.array([[ 0, 1, 2, 0, 4, 5, 6, 7, 8, 9], [ 0, 11, 0, 13, 0, 15, 0, 17, 18, 0]])
      indices_to_keep = t[1].nonzero()[0]
      
      print t[:,indices_to_keep]
      # [[ 1  0  5  7  8]
      #  [11 13 15 17 18]]
      

      【讨论】:

        【解决方案4】:

        使用np.where

        >>> t.T[np.where(t[1])].T
        array([[ 1,  0,  5,  7,  8],
               [11, 13, 15, 17, 18]])
        

        【讨论】:

        • 布尔索引,如 Eelco 的回答,通常比 where + 花式索引更快。
        【解决方案5】:

        我是这样工作的:

        data = array([[ 0, 1, 2, 0, 4, 5, 6, 7, 8, 9], [ 0, 11, 0, 13, 0, 15, 0, 17, 18, 0]])
        res = array([(a, b,) for a, b in zip(data[0], data[1]) if b]).transpose()
        

        得到结果

        In [23]: res
        Out[23]: 
        array([[ 1,  0,  5,  7,  8],
               [11, 13, 15, 17, 18]])
        

        【讨论】:

        • 见eskaev。这不是 numpythonic,相对于为此存在的简单 numpy 解决方案,性能损失了几个数量级。
        • 赞成以平衡 Eelco 不必要的反对票。这很有用,即使它不是最好的。
        猜你喜欢
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-16
        • 2018-05-28
        • 1970-01-01
        相关资源
        最近更新 更多