我有一个0和1的numpy数组。 我需要在一个pythonic中提取所有由0组成的行,并保留其余的行。
我已经找到了以前回答这个问题的问题 这个问题与此重复: Remove all-zero rows in a 2D matrix
但我不明白任何答案。看起来重要的命令是:
a[~(a==0).all(1)]
但我不明白它是如何提取矩阵的。事实上,当我在我的代码中使用这一行时,它会提取一个数组,而不是一个二维矩阵。
我查看了np.all()
explanation,
但看起来它只是一个考验。
有人可以帮帮我吗。
答案 0 :(得分:6)
与代码行a[~(a==0).all(1)]
相关联的主要问题是它适用于numpy.array
,而您似乎使用的是numpy.matrix
,但代码并不完全工作。如果a
是numpy.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。