Python 删除ndarray中多个索引之和为0的行

Python 删除ndarray中多个索引之和为0的行,python,arrays,python-2.7,numpy,Python,Arrays,Python 2.7,Numpy,所以我有一个非常大的二维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(行[2:5])==0 我能想到的唯一方

所以我有一个非常大的二维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(行[2:5])==0


我能想到的唯一方法是使用for循环,但当有数百万行时,这需要很长时间。此外,这需要约束到Python2.7,布尔表达式可以用作索引。您可以使用它们来屏蔽阵列

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

另一种解决方案是使用
numpy。沿轴应用_
计算总和并将其转换为布尔值,并将其用于索引:

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的数字都将是
真的

>>> 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
用于选择这些行

>>> 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]])
>>>