Python:如何在numpy中消除矩阵中的所有零行

时间:2016-02-27 17:37:37

标签: python numpy

我有一个0和1的numpy数组。 我需要在一个pythonic中提取所有由0组成的行,并保留其余的行。

我已经找到了以前回答这个问题的问题 这个问题与此重复: Remove all-zero rows in a 2D matrix

但我不明白任何答案。看起来重要的命令是:

a[~(a==0).all(1)]

但我不明白它是如何提取矩阵的。事实上,当我在我的代码中使用这一行时,它会提取一个数组,而不是一个二维矩阵。

我查看了np.all() explanation, 但看起来它只是一个考验。

有人可以帮帮我吗。

2 个答案:

答案 0 :(得分:6)

与代码行a[~(a==0).all(1)]相关联的主要问题是它适用于numpy.array,而您似乎使用的是numpy.matrix,但代码并不完全工作。如果anumpy.matrix,请改用a[~(a==0).all(1).A1]

由于你是numpy的新手,我会指出通过将它们分解为单个步骤并打印中间结果,可以更好地理解复杂的单行代码。这通常是调试的第一步。我会为a[~(a==0).all(1)]numpy.array的{​​{1}}行执行此操作。

对于numpy.matrix

numpy.array

对于In [1]: from numpy import * In [2]: a = array([[4, 1, 1, 2, 0, 4], [3, 4, 3, 1, 4, 4], [1, 4, 3, 1, 0, 0], [0, 4, 4, 0, 4, 3], [0, 0, 0, 0, 0, 0]]) In [3]: print a==0 [[False False False False True False] [False False False False False False] [False False False False True True] [ True False False True False False] [ True True True True True True]] In [6]: print (a==0).all(1) [False False False False True] In [7]: print ~(a==0).all(1) [ True True True True False] In [8]: print a[~(a==0).all(1)] [[4 1 1 2 0 4] [3 4 3 1 4 4] [1 4 3 1 0 0] [0 4 4 0 4 3]]

numpy.matrix

In [1]: from numpy import * In [2]: a = matrix([[4, 1, 1, 2, 0, 4], [3, 4, 3, 1, 4, 4], [1, 4, 3, 1, 0, 0], [0, 4, 4, 0, 4, 3], [0, 0, 0, 0, 0, 0]]) In [3]: print a==0 [[False False False False True False] [False False False False False False] [False False False False True True] [ True False False True False False] [ True True True True True True]] In [5]: print (a==0).all(1) [[False] [False] [False] [False] [ True]] In [6]: print (a==0).all(1).A1 [False False False False True] In [7]: print ~(a==0).all(1).A1 [ True True True True False] In [8]: print a[~(a==0).all(1).A1] [[4 1 1 2 0 4] [3 4 3 1 4 4] [1 4 3 1 0 0] [0 4 4 0 4 3]] 的输出显示了这不起作用的原因:In[5]生成的2D结果不能用于索引行。因此,我只是在下一行(a==0).all(1)上添加,将其转换为1D。

Here是关于数组和矩阵之间差异的一个很好的答案。此外,我还要补充一点,infix operator完全采用后,使用.A1几乎没有优势。此外,由于大多数人使用numpy.matrix来代表代码中的矩阵,因此他们通常会将numpy.array描述为“矩阵”,从而在术语中造成混淆。

最后,作为旁白,我会注意到以上所有内容都是在命令行的ipython中完成的。 IPython是这类工作的绝佳工具。

答案 1 :(得分:1)

这是一个有效的例子,也许不是最有效的:

import numpy as np
m=np.matrix([[1,2,3],[0,0,0], [4,5,6]])
m_nonzero_rows = m[[i for i, x in enumerate(m) if x.any()]]

在这里,您可以从列表中提取索引号的行。您可以使用满足x.any()的行的索引号创建该列表,据我所知,该列表为" False"如果该行中的每个值都为0。