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

6 投票
3 回答
2561 浏览
提问于 2025-04-17 08:05

我有一个二维的 numpy 数组(也就是矩阵)A,里面有一些有用的数据,但也夹杂着一些无用的垃圾数据,这些垃圾数据是以列向量的形式存在的。同时,我还有一个“选择”数组 B,这个数组里用 '1' 表示那些重要的列,用 '0' 表示那些不重要的列。请问有没有办法只选择 A 中与 B 中的 '1' 对应的列?也就是说,我有一个矩阵

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

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

3 个回答

0

我也想做类似的事情,但我想用向量B的布尔值来切割行和列,解决办法很简单:

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

不确定这是不是最有效的方法(因为涉及到转置),但应该比用for循环要好一些:

A.T[B == 1].T
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列)

撰写回答