【问题标题】:numpy multiple boolean index arraysnumpy 多个布尔索引数组
【发布时间】:2020-03-25 20:42:06
【问题描述】:

我有一个数组,我想在其上使用布尔索引,有多个索引数组,每个数组产生一个不同的数组。示例:

w = np.array([1,2,3])
b = np.array([[False, True, True], [True, False, False]])

应该返回类似于以下内容的内容:

[[2,3], [1]]

我假设由于包含 True 的单元格的数量可能因掩码而异,我不能指望结果驻留在二维 numpy 数组中,但我仍然希望有比在附加掩码上迭代更优雅的东西通过第 i 个 b 掩码索引 w 的结果。

我错过了更好的选择吗?

编辑:之后我想做的下一步是将w[b] 返回的每个数组求和,返回一个标量列表。如果这以某种方式使问题变得更容易,我也很想知道。

【问题讨论】:

  • 您在寻找优雅还是性能?这两个不一样。
  • 如果您只想得到总和,只需使用矩阵乘法 - b.dot(w)
  • 我会使用点积(我在模仿),但在我的真实示例中,bw 都非常大且稀疏,其中 b 已知仅包含 @ 987654331@s。我要在这里表演。
  • 如果它们存储在常规数组而不是稀疏矩阵中,点积应该仍然很快。

标签: python numpy indexing boolean mask


【解决方案1】:

假设您想要一个 numpy 数组列表,您可以简单地使用推导:

w = np.array([1,2,3])
b = np.array([[False, True, True], [True, False, False]])
[w[bool] for bool in b]

# [array([2, 3]), array([1])]

如果您的目标只是您使用的掩码值的总和:

np.sum(w*b) # 6

np.sum(w*b, axis=1) # array([5, 1])
# or b @ w

...因为False 次你的数字将是 0,因此不会影响总和。

【讨论】:

    【解决方案2】:

    试试这个:

    [w[x] for x in b]
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 2019-11-04
      • 2021-12-17
      • 2017-09-24
      • 1970-01-01
      • 2021-08-01
      • 2012-04-10
      • 2013-06-19
      相关资源
      最近更新 更多