在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)
但是不知为什么,这段代码似乎没有任何效果,尽管我做了很多打印命令,显示所有变量在执行这段代码之前都正常。
一定有简单的方法可以“删除任何包含零值的行”。
有没有人能告诉我该写什么代码来实现这个?
6 个回答
5
这和你最开始的方法差不多,而且会比unutbu的回答占用更少的空间,不过我觉得它可能会慢一些。
>>> 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
这个属性。
14
这里有一个一行代码的写法(是的,它和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]])
顺便说一下,这种方法在处理大矩阵时要快得多,快得多。比如说,对于一个2048 x 5的矩阵,这种方法大约快了1000倍。
另外,user333700的方法(在他的评论中提到的)在我的测试中稍微快了一点,虽然我真的搞不懂为什么。
210
删除数组中的行和列最简单的方法就是使用 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)
你可以找到包含0的行的索引,把它们放在一个列表或元组里,然后把这个列表或元组作为函数的第二个参数传进去。