我有一个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掩码数组,因为我根本不想要掩码数据
答案 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,:]