【问题标题】:Delete rows in ndarray where sum of multiple indexes is 0删除ndarray中多个索引之和为0的行
【发布时间】:2017-08-18 22:33:44
【问题描述】:

所以我有一个非常大的二维 numpy 数组,例如:

array([[ 2, 4, 0, 0, 0, 5, 9, 0],
       [ 2, 3, 0, 1, 0, 3, 1, 1],
       [ 1, 5, 4, 3, 2, 7, 8, 3],
       [ 0, 7, 0, 0, 0, 6, 4, 4],
       ...,
       [ 6, 5, 6, 0, 0, 1, 9, 5]])

我想快速删除数组中np.sum(row[2:5]) == 0所在的每一行

我能想到的唯一方法是使用 for 循环,但是当有数百万行时,这需要很长时间。此外,这需要限制为 Python 2.7

【问题讨论】:

    标签: python arrays python-2.7 numpy


    【解决方案1】:

    布尔表达式可以用作索引。您可以使用它们来屏蔽数组。

    inputarray = array([[ 2, 4, 0, 0, 0, 5, 9, 0],
                        [ 2, 3, 0, 1, 0, 3, 1, 1],
                        [ 1, 5, 4, 3, 2, 7, 8, 3],
                        [ 0, 7, 0, 0, 0, 6, 4, 4],
                        ...,
                        [ 6, 5, 6, 0, 0, 1, 9, 5]])
    
    mask = numpy.sum(inputarray[:,2:5], axis=1) != 0
    result = inputarray[mask,:]
    

    这是在做什么:

    • inputarray[:, 2:5] 选择您要汇总的所有列
    • axis=1 表示我们正在对列进行求和
    • 我们希望保留总和为零的行
    • 掩码用作行索引,选择布尔表达式为True的行

    【讨论】:

      【解决方案2】:

      另一种解决方案是使用numpy.apply_along_axis 计算总和并将其转换为布尔值,并将其用于您的索引:

      my_arr = np.array([[ 2, 4, 0, 0, 0, 5, 9, 0],
             [ 2, 3, 0, 1, 0, 3, 1, 1],
             [ 1, 5, 4, 3, 2, 7, 8, 3],
             [ 0, 7, 0, 0, 0, 6, 4, 4],])
      my_arr[np.apply_along_axis(lambda x: bool(sum(x[2:5])), 1, my_arr)]
      
      array([[2, 3, 0, 1, 0, 3, 1, 1],
             [1, 5, 4, 3, 2, 7, 8, 3]])
      

      我们只是将总和也转换为布尔值,因为任何非 0 的数字都将是 True

      【讨论】:

        【解决方案3】:
        >>> a
        array([[2, 4, 0, 0, 0, 5, 9, 0],
               [2, 3, 0, 1, 0, 3, 1, 1],
               [1, 5, 4, 3, 2, 7, 8, 3],
               [0, 7, 0, 0, 0, 6, 4, 4],
               [6, 5, 6, 0, 0, 1, 9, 5]])
        

        您对第 2 到 5 列感兴趣

        >>> a[:,2:5]
        array([[0, 0, 0],
               [0, 1, 0],
               [4, 3, 2],
               [0, 0, 0],
               [6, 0, 0]])
        >>> b = a[:,2:5]
        

        你想在每一行中找到这些列的总和

        >>> sum_ = b.sum(1)
        >>> sum_
        array([0, 1, 9, 0, 6])
        

        这些是符合您条件的行

        >>> sum_ != 0
        array([False,  True,  True, False,  True], dtype=bool)
        >>> keep = sum_ != 0
        

        使用boolean indexing 选择这些行

        >>> a[keep, :]
        array([[2, 3, 0, 1, 0, 3, 1, 1],
               [1, 5, 4, 3, 2, 7, 8, 3],
               [6, 5, 6, 0, 0, 1, 9, 5]])
        >>> 
        

        【讨论】:

          猜你喜欢
          • 2021-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-04
          • 2021-08-06
          • 2022-09-23
          • 2018-06-05
          • 1970-01-01
          相关资源
          最近更新 更多