通过使用另一个numpy数组作为掩码删除列来压缩numpy数组(矩阵)

时间:2011-12-10 00:53:29

标签: python numpy

我有一个2D numpy数组(即矩阵)A,其中包含以列向量形式与垃圾交叉的有用数据以及包含'selection'数组B对于那些重要的列为'1',对于那些不重要的列为0。有没有办法只选择A中与B对应的列?即我有一个矩阵

A = array([[ 0,  1,  2,  3,  4],   and a vector B = array([ 0,  1,  0,  1,  0])
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24]])

我想要

array([[1,   3],
       [6,   8],
       [11, 13],
       [16, 18],
       [21, 23]])

有优雅的方法吗?现在我只有一个遍历B的for循环。

注意:我正在处理的矩阵很大,所以我不想使用numpy掩码数组,因为我根本不想要掩码数据

3 个答案:

答案 0 :(得分:8)

>>> A
  array([[ 0,  1,  2,  3,  4],
         [ 5,  6,  7,  8,  9],
         [10, 11, 12, 13, 14],
         [15, 16, 17, 18, 19],
         [20, 21, 22, 23, 24]])
>>> B = NP.array([ 0,  1,  0,  1,  0])

>>> # convert the indexing array to a boolean array
>>> B = NP.array(B, dtype=bool)

>>> # index A against B--indexing array is placed after the ',' because
>>> # you are selecting columns

>>> res = A[:,B]

>>> res
  array([[ 1,  3],
         [ 6,  8],
         [11, 13],
         [16, 18],
         [21, 23]])  


NumPy中基于索引的切片的语法优雅而简单。一些规则涵盖了大多数用例:

  • 表单为 [行,列]

  • 使用冒号“:”指定所有行或所有列,例如 [:,4] (提取 整个第5栏)

答案 1 :(得分:2)

不确定它是否是最有效的方式(因为换位),但它应该比for循环更好:

A.T[B == 1].T

答案 2 :(得分:0)

我有兴趣做同样的事情,但切片排和&使用向量B的布尔值的列,解决方案很简单:

res = A[:,B][B,:]