8

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

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 中具有索引的行?抱歉,我对此很陌生,任何帮助将不胜感激。

4

4 回答 4

15

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

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

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

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

于 2013-08-23T09:07:02.903 回答
3

看起来并没有np.delete改变数组,只是返回一个新数组,所以

代替

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

尝试

a = np.delete(a,zero_row, 0)
于 2013-08-23T08:09:42.793 回答
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]]
于 2013-08-23T08:22:53.737 回答
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,则将其初始化为当前行。

于 2013-08-23T08:55:22.770 回答