【问题标题】:Python - NumPy - deleting multiple rows and columns from an arrayPython - NumPy - 从数组中删除多行和多列
【发布时间】:2015-04-25 11:21:21
【问题描述】:

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

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 内容如下:

通常最好使用布尔掩码。

我该怎么做呢?谢谢。

【问题讨论】:

  • 当你提出这类问题时,解释每个变量的大小(例如矩阵的大小、删除的行数等)很重要,因为很多答案的质量取决于这个。
  • @Veedrac 谢谢!我知道。以后我会尽量不忘记。在这种情况下,方阵中的行数永远不会超过 10。

标签: python python-3.x numpy matrix


【解决方案1】:

与其删除您不想要的列和行,不如选择您想要的列和行更容易。另请注意,从零开始计算行和列是标准的。为了获得第一个示例,您需要选择第 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

【讨论】:

  • numpy.ix 正是我所追求的。有一天我应该坐下来阅读 numpy 文档。谢谢!
  • 通读整本手册只是为了发现晦涩但有用的功能并不是很有趣。更好地学习一些基本教程,以及一些关于导入但令人困惑的概念的更详细的教程,例如广播和我在答案中链接的关于索引的教程。
  • 第一个仍然涉及复制。请注意,如果您只删除了 2 行和 2 列但有一个大矩阵,则可以在删除的行之间取 9 个子矩阵的总和。这些切片不会涉及副本。
【解决方案2】:

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

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])

【讨论】:

  • 这也是一个很好的解决方案,但不能为每种情况写下明确的掩码。谢谢你的回答。
  • @tommy.carstensen 好吧,您可以轻松地扩展它,定义接受行数/列数并输出相应掩码的函数。尽管我同意,如果您可以接受使用 np.ix_ 选择剩余的列,那将是一个更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 2020-06-19
相关资源
最近更新 更多