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

2024-04-18 11:15:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我已经找过以前的问题来回答这个问题 这个问题是这个问题的复本: Remove all-zero rows in a 2D matrix

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

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

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

我看过np.all()explanation, 但看起来只是个测试。

有人能帮我一下吗。


Tags: 答案代码in命令numpynp矩阵数组
2条回答

与代码行a[~(a==0).all(1)]相关联的主要问题是,它对numpy.array有效,而且似乎您正在使用numpy.matrix,而代码并不是很有效。如果anumpy.matrix,则使用a[~(a==0).all(1).A1]

既然您是numpy新手,我将指出,通过将复杂的单行代码分解成单个步骤并打印中间结果,可以更好地理解它们。这通常是调试的第一步。我将对a[~(a==0).all(1)]行和numpy.matrix行执行此操作。

对于anumpy.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]]

对于anumpy.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]的输出显示了这不起作用的原因:(a==0).all(1)生成一个不能用于索引行的2D结果。因此,我在下一行中附加了.A1,将其转换为1D

Here很好地回答了数组和矩阵之间的区别。此外,我还要补充的是,一旦完全采用infix operator,使用numpy.matrix几乎没有任何优势。另外,由于大多数人在代码中使用numpy.array来表示矩阵,他们经常将numpy.array描述为“矩阵”,从而在术语上造成混乱。

最后,作为旁白,我将注意到以上所有操作都是在命令行的ipython中完成的。IPython是这类工作的优秀工具。

这是一个有效的例子,可能不是最有效的:

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()的行的索引号创建该列表,据我所知,如果行中的每个值都为0,则该列表将给出“False”。

相关问题 更多 >