2013-08-23 83 views
6

我试图写一个函数来删除它在零值的所有行 这不是从我的代码,但这个想法的一个例子,我现在用:如何删除包含零的numpy数组中的一行?

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中索引的行? 对不起,我相当新的任何帮助将非常感激。

+0

只需一条评论。你在'b'上发布​​循环的示例代码来删除单独的行。这根本不需要。 'a = np.delete(a,b,axis = 0)'就像一个魅力一样('axis'指定使它更加明显我们正在做什么) –

回答

2

貌似np.delete开不改变数组,只是返回一个新的数组,所以

而不是

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

尝试

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

啊,这很愚蠢,可能到凌晨。但我确实改变了这一点,并得到了 ** ValueError:无效的条目**感谢您的快速反应 –

1

我想我已经找到了答案:

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

for i in a: 
    if not (0 in i): 
     try: 
      b = np.vstack((b, i)) 
     except NameError: 
      b = i 
a = b 
print 'a = ', a 

在此版本中,您循环遍历每行并测试行的0成员资格。如果该行不包含零,则尝试使用np.vstack将该行附加到名为b的数组。现在,初始化b可能会很棘手,因为它必须是一个numpy数组,其元素个数与a的一行相同,但不是循环两次,并为它寻找第一个值,我只是使用try/except捕捉它不存在的情况并分配而不是使用vstack。

10

I'm trying to write a function to delete all rows in which have a zero value in.

你并不需要编写一个函数,它可以在一个单一的表达来完成:

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

读为:从a选择是完全不为零的所有行。

+0

有没有办法做到这一点的一维数组?你会忽略轴规格吗?即 ** b [np.all(b!= 0,)] **其中b是一个数组 –

+2

'b = b [b!= 0]'删除'b'中的'0'。它被称为布尔索引。 –

+0

如果要删除包含“2”的所有列,该怎么办? 'a [np.all(a!= 2,axis = 0)]'不能按预期工作。我不得不求助于操纵转置。任何建议? –