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

2024-04-19 07:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个非常大的二维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循环,但是当有数百万行时,这需要很长时间。此外,这需要限制在Python2.7中


Tags: 方法numpyfornp数组arrayrowsum
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]])
>>> 

布尔表达式可用作索引。您可以使用它们来遮罩阵列。你知道吗

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.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。你知道吗

相关问题 更多 >