【问题标题】:extracting vectors from an array using logical indexing使用逻辑索引从数组中提取向量
【发布时间】:2017-04-20 10:38:48
【问题描述】:

我有以下 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 选择bb=bb[btable==True,:]

14 打印(choicebb)

IndexError: 数组索引过多

这可以在matlab中使用choicebb=bb(btable,:);轻松完成

【问题讨论】:

  • btable 必须是 np.array([True,False,False,True,True])
  • 我使用matches=(idx==i) 之类的命令生成它,其中 idx 是 kx1 数组,i 是我的匹配条件。

标签: python arrays numpy indexing


【解决方案1】:

使用np.ravel() 获取1D 版本的掩码或使用[:,0] 切出第一列并将其用于对数据数组的逻辑索引,就像这样 -

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

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

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

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

【讨论】:

  • 谢谢你,这行得通!由于它已经是一个 nx1 数组,我能否解释一下需要获取 1D 版本的掩码背后的逻辑?
  • @user2118915 看看添加的 cmets 是否有意义。
  • 我现在明白了。谢谢!
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多