You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效且可读地实现基于N×2型start-stop数组的numpy.arange结果合并?

当然有更好的办法啦!你现在用的循环+np.append的方式虽然能得到正确结果,但每次调用np.append都会重新分配数组内存,当输入数组行数很多或者区间范围很大时,效率会变得很低。这里有两种既高效又可读性强的实现方式,供你参考:

方法一:广播与重复法(性能优先)

这个方法通过numpy的向量化操作避免了生成多个小数组,内存分配更高效,适合处理大规模数据。核心思路是:每个区间的元素等价于「起始值 + 0到(区间长度-1)的偏移量」,我们可以先把起始值按对应区间长度重复,再加上拼接后的偏移量数组,就能直接得到结果。

import numpy as np

arr = np.array([[1, 3], [4, 5], [7, 8], [8, 10]])
# 计算每个区间的元素个数
lengths = arr[:, 1] - arr[:, 0]
# 将每个起始值重复对应次数,得到基础数组
starts_repeated = np.repeat(arr[:, 0], lengths)
# 生成所有区间的偏移量并拼接:比如第一个区间偏移0、1,第二个偏移0,依此类推
offsets = np.concatenate([np.arange(l) for l in lengths])
# 起始值+偏移量得到最终结果
out = starts_repeated + offsets

print(out)  # 输出:[1 2 4 7 8 9]

方法二:列表推导式+一次性拼接(可读性优先)

这个方法的代码非常直观,一眼就能理解逻辑:先通过列表推导式生成每个区间的np.arange结果,再用np.concatenate一次性合并所有数组。相比循环np.append,它只做一次内存分配,效率提升明显,同时可读性拉满。

import numpy as np

arr = np.array([[1, 3], [4, 5], [7, 8], [8, 10]])
# 遍历每个区间生成arange,再一次性拼接
out = np.concatenate([np.arange(start, end) for start, end in arr])

print(out)  # 输出:[1 2 4 7 8 9]

小总结

  • 如果处理的是大规模数据,追求极致性能,优先选方法一;
  • 如果更看重代码的简洁直观,日常中小规模数据处理,方法二完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:48:11