Python-NumPy-从数组中删除多个行和列

2024-06-08 13:33:57 发布

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

假设我有一个平方矩阵作为输入:

array([[0, 1, 1, 0],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 1, 1, 0]])

我想在删除第2行和第3行以及第2列和第3列之后,对数组中的非零进行计数。之后,我想对第3和第4行以及第3和第4列做同样的操作。因此输出应该是:

0  # when removing rows/cols 2 and 3
3  # when removing rows/cols 3 and 4

下面是使用np.delete的原始解决方案:

import numpy as np
a = np.array([[0,1,1,0],[1,1,1,1],[1,1,1,1],[0,1,1,0]])
np.count_nonzero(np.delete(np.delete(a, (1,2), axis=0), (1,2), axis=1))
np.count_nonzero(np.delete(np.delete(a, (2,3), axis=0), (2,3), axis=1))

但是np.delete返回一个新数组。有没有一种更快的方法,包括同时删除行和列?可以使用掩蔽吗?np.delete上的documentation显示:

Often it is preferable to use a boolean mask.

我该怎么做呢?谢谢。


Tags: andcountnp矩阵数组解决方案deletearray
2条回答

与其删除不需要的列和行,不如更容易选择需要的列和行。还要注意,从零开始计算行和列是标准的。为了获得第一个示例,您需要选择行0和3以及行0和3中的所有元素。这需要advanced indexing,您可以使用ix_ utility function

In [25]: np.count_nonzero(a[np.ix_([0,3], [0,3])])  
Out[25]: 0

对于第二个示例,您希望选择行0和1以及列0和1,这可以使用basic slicing

In [26]: np.count_nonzero(a[:2,:2])
Out[26]: 3

不需要通过删除行/列来修改原始数组,以便计算非零元素的数量。只需使用索引

a = np.array([[0,1,1,0],[1,1,1,1],[1,1,1,1],[0,1,1,0]])
irows, icols = np.indices(a.shape)
mask = (irows!=2)&(irows!=3)&(icols!=2)&(icols!=3)
np.count_nonzero(a[mask])

相关问题 更多 >