这个问题在这里已有答案:
我正在尝试编写一个函数来删除其中包含零值的所有行。这不是来自我的代码,而是我正在使用的想法的一个示例:
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中索引的行?对不起,我对此很新,任何帮助都会非常感激。
我正在尝试编写一个函数来删除其中包含零值的所有行。
您不需要为此编写函数,可以在单个表达式中完成:
>>> a[np.all(a != 0, axis=1)]
array([[7, 1, 2, 8],
[5, 8, 3, 6]])
读作:从a
中选择完全非零的所有行。
看起来np.delete
不会改变数组,只返回一个新数组,所以
代替
x = np.delete(a,zero_row, 0)
尝试
a = np.delete(a,zero_row, 0)
我想我找到了答案:
正如@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]]
我认为这有助于提高可读性(并允许您循环一次,而不是两次):
#!/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,则将其初始化为当前行。