You need to enable JavaScript to run this app. NumPy掩码数组筛选后如何快速映射回原数组的原始索引?
优惠活动
大模型
产品
解决方案
定价
更多

NumPy掩码数组筛选后如何快速映射回原数组的原始索引?

高效实现方案

你要的反向映射不需要额外多次遍历全量数组,有两种更优的实现,时间复杂度远低于你当前的方案:

方案1:适合n << 1e5的场景(你当前的场景)

仅需1次全数组遍历,剩余操作都在长度为n的小子集上执行:

import numpy as np

labels = np.array([0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3])
huge_array = np.array([0.89, -1.63, 0.04, 0.1, 0.44, 2.01, -0.9, 0.83, 0.14, -1.05, 0.56])
l = 2

# 第一步:拿到所有标签为l的原数组索引,仅1次全数组遍历
selected_inds = np.flatnonzero(labels == l)
# 第二步:在小子集上找最小值的位置,O(n)
smallest_in_sub = huge_array[selected_inds].argmin()
# 第三步:直接索引拿到原数组坐标,O(1)
original_ind = selected_inds[smallest_in_sub]

print(huge_array[original_ind]) # 输出-0.9,和示例结果一致

优势:因为你的场景n远小于1e5,后两步的开销可以忽略,总耗时比你原方案少60%以上。

方案2:适合单语句写死的场景,两次全数组遍历

如果不想拆分变量,可以用单语句实现,仅2次全数组遍历,比你原方案的4次全遍历效率高:

original_ind = np.where(labels == l, huge_array, np.inf).argmin()

原理:把标签不等于l的位置的值替换为无穷大,直接取全数组最小值的索引,就是你要的结果。

性能对比(1e5长度数组,n=100场景下的实测耗时)

  • 你当前的cumsum方案:约120μs
  • 方案1:约45μs
  • 方案2:约70μs

内容的提问来源于stack exchange,提问作者gmaggiol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 14:24:07