Python-NumPy-从数组中删除多行和多列
假设我有一个方阵作为输入:Python-NumPy-从数组中删除多行和多列,python,python-3.x,numpy,matrix,Python,Python 3.x,Numpy,Matrix,假设我有一个方阵作为输入: 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
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的简单解决方案。删除:
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
的内容如下:
通常最好使用布尔掩码
我该怎么做呢?谢谢。为了计算非零元素的数量,无需通过删除行/列来修改原始数组。简单地使用索引
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])
与其删除不需要的列和行,不如更容易地选择需要的列和行。还要注意,从零开始计算行和列是标准的。为了获得第一个示例,您需要选择第0行和第3行以及第0行和第3行中的所有元素。这需要,为此,您可以使用:
对于第二个示例,您希望选择第0行和第1行以及第0列和第1列,这可以使用以下方法完成:
numpy.ix
正是我想要的。总有一天我会坐下来阅读numpy文档。谢谢通读整个手册只是为了发现晦涩但有用的功能并不是一件有趣的事。最好学习一些基本教程,以及一些关于导入但容易混淆的概念(如广播)的更详细教程,以及我在回答中链接的关于索引的教程。第一部分仍然涉及复制。请注意,如果您只删除了2行和2列,但却有一个较大的矩阵,则可以获取删除行之间9个子矩阵的总和。这些切片不会涉及副本。这也是一个很好的解决方案,但为每种情况写下一个显式掩码不是一个选项。谢谢您的回答。@tommy.carstensen您可以轻松地扩展它,定义接收行/列编号并输出相应掩码的函数。虽然我同意如果你能接受用np.ix_uuu
选择剩下的列,那将是一个更好的方法。当你提出这类问题时,解释每个变量的大小(例如矩阵的大小、删除的行数等)很重要,因为很多答案的质量都取决于此。@Veedrac谢谢!我知道。以后我会尽量不忘记的。在这种情况下,方阵中的行数从未超过10。
In [25]: np.count_nonzero(a[np.ix_([0,3], [0,3])])
Out[25]: 0
In [26]: np.count_nonzero(a[:2,:2])
Out[26]: 3