如何使用纯向量化方法为numpy数组每个元素生成指定长度的连续序列
实现方案
完全向量化的实现不需要任何Python级循环,核心思路是生成重复的基底数组 + 逐段偏移量相加,具体代码如下:
import numpy as np # 示例输入 a = np.array([10,9,12]) ranges = np.array([2,4,3]) # 1. 生成基底数组:将a的每个元素按对应ranges值重复 base = np.repeat(a, ranges) # 2. 生成完全向量化的偏移数组 cum_len = np.cumsum(ranges) offsets = np.ones(cum_len[-1], dtype=int) offsets[0] = 0 offsets[cum_len[:-1]] = -ranges[:-1] + 1 offsets = offsets.cumsum() # 3. 相加得到最终结果 res = base + offsets print(res) # 输出:[10 11 9 10 11 12 12 13 14]
原理解释
np.repeat(a, ranges)输出长度和最终结果一致,每个位置是对应区间的起始值,示例中输出为[10 10 9 9 9 9 12 12 12]- 偏移量生成部分通过numpy前缀和、索引赋值、累积求和实现,全程无Python层循环,每个区间的偏移值从0开始递增到区间长度-1,示例中输出为
[0 1 0 1 2 3 0 1 2] - 两者逐元素相加即可得到每个区间的连续值序列
如果输入规模较小、对性能要求不高,也可以用更简洁的写法:
res = np.concatenate([start + np.arange(length) for start, length in zip(a, ranges)])
内容的提问来源于stack exchange,提问作者pr94
相关产品推荐
相关产品推荐

