如何高效且可读地实现基于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
相关产品推荐
相关产品推荐

