删除numpy数组中的行

Med*_*ath 81 python numpy delete-row

我有一个可能如下所示的数组:

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]
Run Code Online (Sandbox Code Playgroud)

请注意,其中一行在结尾处的值为零.我想删除任何包含零的行,同时保留所有单元格中包含非零值的行.

但是每次填充数组时,数组都会有不同的行数,每次都会将零位于不同的行中.

我使用以下代码行获取每行中非零元素的数量:

NumNonzeroElementsInRows    = (ANOVAInputMatrixValuesArray != 0).sum(1)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

但由于某种原因,这段代码似乎没有做任何事情,即使执行大量打印命令表明所有变量似乎都正确填充导致代码.

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

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

Jai*_*nde 146

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

假设我有以下数组x:

x = array([[1,2,3],
        [4,5,6],
        [7,8,9]])
Run Code Online (Sandbox Code Playgroud)

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

x = numpy.delete(x, (0), axis=0)
Run Code Online (Sandbox Code Playgroud)

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

x = numpy.delete(x,(2), axis=1)
Run Code Online (Sandbox Code Playgroud)

因此,您可以找到其中包含0的行的索引,将它们放在列表或元组中,并将其作为函数的第二个参数传递.

  • 请注意,[numpy delete()docs](https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html)表明"通常最好使用布尔掩码",因为返回新数组 - 在该链接下提供了一个示例 (6认同)
  • 谢谢!我遇到了同样的问题,我不明白为什么简单地调用 `numpy.delete(x, index)` 不起作用。 (2认同)
  • @arturomp 但面具是非破坏性的。调用 delete() 时间/内存消耗吗? (2认同)

Jus*_*eel 13

这是一个单行(是的,它类似于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]])
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这种方法比大型矩阵的掩蔽数组方法快得多.对于2048 x 5矩阵,此方法快约1000倍.

顺便说一下,user333700的方法(来自他的评论)在我的测试中略快一些,尽管令人难以理解为什么.

  • @ user333700,它们都可以短路,只是为了不同的东西.在检测到第一个真实案例时,"任何"短路为真; 检测到第一个错误情况时,`all`短路为false.在这种情况下,短路应该是平局,但在我看来,做额外的不应该让它变慢. (4认同)
  • "any"可以短路,一旦检测到第一个真实情况,就可以停止,而"all"必须检查所有条件.所以,不是("〜"在numpy中),通常应该比所有更快. (3认同)

mtr*_*trw 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]])
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您的台词p.delete()对我不起作用- ndarray没有.delete属性。

  • 简单一点:p [〜(p == 0).any(1)]或更明确地显示行:p [〜(p == 0).any(1),:] (8认同)