如何删除包含零的numpy数组中的行? [重复]

问题描述 投票:8回答:4

这个问题在这里已有答案:

我正在尝试编写一个函数来删除其中包含零值的所有行。这不是来自我的代码,而是我正在使用的想法的一个示例:

import numpy as np
a=np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0]))
b=[]

for i in range(len(a)):
    for j in range (len(a[i])):
        if a[i][j]==0:
            b.append(i)

print 'b=', b
for zero_row in b:
    x=np.delete(a,zero_row, 0)

print 'a=',a

这是我的输出:

b= [1, 3]
a= [[7 1 2 8]
 [4 0 3 2]
 [5 8 3 6]
 [4 3 2 0]]

如何摆脱b中索引的行?对不起,我对此很新,任何帮助都会非常感激。

python arrays numpy zero delete-row
4个回答
13
投票

我正在尝试编写一个函数来删除其中包含零值的所有行。

您不需要为此编写函数,可以在单个表达式中完成:

>>> a[np.all(a != 0, axis=1)]
array([[7, 1, 2, 8],
       [5, 8, 3, 6]])

读作:从a中选择完全非零的所有行。


2
投票

看起来np.delete不会改变数组,只返回一个新数组,所以

代替

x = np.delete(a,zero_row, 0)

尝试

a = np.delete(a,zero_row, 0)

1
投票

我想我找到了答案:

正如@tuxcanfly所说,我把x换成了a。此外,我现在已经删除了for循环,因为它出于某种原因删除了索引为2的行。

相反,我现在只是选择使用b作为删除函数删除行,并使用列表中的元素删除具有该索引的行。

新代码:

import numpy as np
a=np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0]))
b=[]

for i in range(len(a)):
    for j in range (len(a[i])):
        if a[i][j]==0:
            b.append(i)
print 'b=',b
for zero_row in b:
    a=np.delete(a,b, 0)

print 'a=',a

和输出:

b= [1, 3]
a= [[7 1 2 8]
 [5 8 3 6]]

0
投票

我认为这有助于提高可读性(并允许您循环一次,而不是两次):

#!/usr/bin/env python

import numpy as np
a = np.array(([7,1,2,8], [4,0,3,2], [5,8,3,6], [4,3,2,0]))
b = None

for row in a:
    if 0 not in row:
        b = np.vstack((b, row)) if b is not None else row

a = b
print 'a = ', a

在此版本中,您遍历每一行并测试该行中0的成员资格。如果该行不包含零,则尝试使用np.vstack将该行追加到名为b的数组中。如果尚未分配b,则将其初始化为当前行。

© www.soinside.com 2019 - 2024. All rights reserved.