本文介绍如何利用 numpy 的广播(broadcasting)和 `ravel()` 方法,将原始一维数组中每个元素扩展为连续的 n 个数值序列,最终合并为一个展开后的一维数组,全程避免显式 for 循环,兼具简洁性与高性能。
在科学计算和数据预处理中,常需将离散锚点值(如起始位置、时间戳、索引偏移)各自“展开”为一段连续整数区间。例如,给定数组 [1, 9, 20, 56, 78, 120],希望对每个元素生成其后连续 3 个数(含自身),即 [1,2,3], [9,10,11], ..., 最终拼接为单个一维数组:
[1, 2, 3, 9, 10, 11, 20, 21, 22, 56, 57, 58, 78, 79, 80, 120, 121, 122]。
这一目标可通过 NumPy 的广播机制优雅实现,核心代码仅一行:
import numpy as np a = np.array([1, 9, 20, 56, 78, 120]) n = 3 out = (np.arange(n) + a[:, None]).ravel() print(out) # 输出: [ 12 3 9 10 11 20 21 22 56 57 58 78 79 80 120 121 122]
若需不同长度的扩展(如每个元素扩展数不同),则需改用 np.repeat + np.arange 组合,但本方案在统一扩展长度场景下最为简洁高效——它完美体现了 NumPy 向量化思维的核心优势:用广播替代循环,以声明式表达替代过程式逻辑。