删除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)将删除包含一个被屏蔽值的行。 我想这样的速度要快得多