删除numpy数组中的行

我有一个数组,可能看起来像这样:

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]] 

注意其中一行在最后有一个零值。 我想删除任何包含零的行,同时保留所有单元格中包含非零值的行。

但是,每次填充时,数组的行数都不相同,而且每次都将位于不同的行中。

我用下面这行代码得到了每一行中非零元素的数量:

 NumNonzeroElementsInRows = (ANOVAInputMatrixValuesArray != 0).sum(1) 

对于上面的数组, NumNonzeroElementsInRows包含:[5 4]

这五个表示行0中的所有可能的值都是非零,而四则表示行1中的一个可能的值是零。

因此,我试图使用下面的代码行来查找和删除包含零值的行。

 for q in range(len(NumNonzeroElementsInRows)): if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max(): p.delete(ANOVAInputMatrixValuesArray, q, axis=0) 

但由于某种原因,这段代码似乎没有做任何事情,即使执行了大量的打印命令,表明所有的variables似乎都正确地填充到代码中。

必须有一些简单的方法来简单地“删除任何包含零值的行”。

任何人都可以告诉我要写什么代码来完成这个?

从数组中删除行和列的最简单方法是numpy.delete方法。

假设我有下面的数组x

 x = array([[1,2,3], [4,5,6], [7,8,9]]) 

要删除第一行,请执行以下操作:

 x = numpy.delete(x, (0), axis=0) 

要删除第三列,请执行以下操作:

 x = numpy.delete(x,(2), axis=1) 

所以你可以find其中有0的行的索引,把它们放在一个列表或一个元组中,并将其作为函数的第二个parameter passing。

这里是一个class轮(是的,它类似于user333700的,但更直接一点):

 >>> import numpy as np >>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]) >>> print arr[arr.all(1)] array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875 , 0.53172222]]) 

顺便说一下,这种方法比大型matrix的蒙板数组方法要快得多。 对于2048 x 5的matrix,这种方法快了大约1000倍。

顺便说一句,user333700的方法(从他的评论)在我的testing中稍微快一点,尽pipe这令我难以理解。

这和你原来的方法很相似,比unutbu的答案占用的空间要less ,但是我怀疑它会比较慢。

 >>> import numpy as np >>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]]) >>> p array([[ 1.5, 0. ], [ 1.4, 1.5], [ 1.6, 0. ], [ 1.7, 1.8]]) >>> nz = (p == 0).sum(1) >>> q = p[nz == 0, :] >>> q array([[ 1.4, 1.5], [ 1.7, 1.8]]) 

顺便说一句,你的行p.delete()不适合我 – ndarray没有.delete属性。

numpy提供了一个简单的函数来完成同样的事情:假设你有一个被屏蔽的数组“a”,调用numpy.ma.compress_rows(a)将删除包含一个被屏蔽值的行。 我想这样的速度要快得多