假设我有一个方矩阵作为 输入 :
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读取:
通常最好使用布尔掩码。
我该怎么做呢?感谢。
答案 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])