Python 删除ndarray中多个索引之和为0的行
所以我有一个非常大的二维numpy数组,比如: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 我能想到的唯一方
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]])
>>>