在numpy数组中删除行

109 投票
6 回答
340339 浏览
提问于 2025-04-16 05:06

我有一个数组,可能长这样:

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的行的索引,把它们放在一个列表或元组里,然后把这个列表或元组作为函数的第二个参数传进去。

撰写回答