使用逻辑索引从数组中提取向量

时间:2017-04-20 10:38:48

标签: python arrays numpy indexing

我有以下numpy数组: (nx1)的真值表,以及(nxk)的矩阵,其中n为5,k为2。

btable = np.array([[True],[False],[False],[True],[True]])
bb=np.array([[1.842,4.607],[5.659,4.799],[6.352,3.290],[2.904,4.612],[3.231,4.939]])

我想根据btable中的索引值提取bb中的向量。

我尝试了choicebb=bb[btable==True],它获得了结果

[ 1.84207953  2.90401653  3.23197916]

choicebb=bb[btable]也会得到相同的结果。

我想要的是

[[1.842,4.607]

[2.904,4.612]

[3.231,4.939]]

我也试过

choicebb=bb[btable==True,:]

然后我会得到

  

---> 13 choicebb = bb [btable == True,:]

     

14 print(choicebb)

     

IndexError:数组索引太多

这可以使用choicebb=bb(btable,:);

在matlab中轻松完成

1 个答案:

答案 0 :(得分:1)

使用1D获取掩码的np.ravel()版本,或者使用[:,0]切出第一列并将其用于逻辑索引到数据数组中,如下所示 -

bb[btable.ravel()]
bb[btable[:,0]]

请注意,bb[btable.ravel()]基本上是 - bb[btable.ravel(),:]。在NumPy中,如果要选择所有元素,我们可以跳过提及尾随轴,这就是为什么它被简化为bb[btable.ravel()]

解释:要索引到单个轴并选择沿其余轴的所有元素,我们需要沿着该轴输入一维数组(布尔或整数数组),沿着剩余的轴使用:。在我们的例子中,我们将索引到第一个轴来选择行,因此我们需要沿着该轴输入一个布尔数组,并沿着其余轴输入:

当我们提供掩码的2D版本时,它会沿着相应的多个轴进行索引。因此,当我们输入(N,1)形状的布尔数组时,我们选择正确的行,但也只选择第一列元素,这不是预期的输出。