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

时间:2015-04-25 11:21:21

标签: python python-3.x numpy matrix

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

while

我想在删除第2行和第3行以及第2列和第3列之后计算数组中的非零。之后我想对第3行和第4行以及第3列和第4行执行相同操作。因此 输出 应为:

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

以下是使用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上的documentation读取:

  

通常最好使用布尔掩码。

我该怎么做呢?感谢。

2 个答案:

答案 0 :(得分:5)

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

df1 + list(4, 8)

对于第二个示例,您要选择行0和1以及列0和1,这可以使用basic slicing来完成:

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

答案 1 :(得分: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])