如何通过范围索引数组从numpy数组中提取指定区间元素生成新数组
Numpy按指定索引区间提取元素实现方案
首先导入依赖库:
import numpy as np
你可以根据自己的需求选择以下两种实现方式:
方式1:不同长度区间对齐,短区间补空值
匹配你示例中要求的输出格式,空值用np.nan(可自行替换为-1、0等自定义填充值):
# 示例输入构造 A = np.array([1,161,51,105,143,2,118,127,37,19,4,29,13,136,129,128,129, 250,52,53,57,53,49,53,57,49,55,177,84,69,85,210,6,43,128, 194,253,0,236,129,131,53,54,56,54,50,48,182,128,52,113,13,169, 57,41,233,128,254,160,128,9,81,75,166,89,178,128,128,128,128,128, 128,177,128,84,81,84,197,206]) I = np.array([[0,2],[2,5],[5,8],[8,14]]) # 计算所有区间的最大长度 interval_lens = I[:, 1] - I[:, 0] max_interval_len = interval_lens.max() # 初始化结果数组,默认填充np.nan对应你要求的nul result = np.full((len(I), max_interval_len), np.nan) # 逐区间赋值 for idx, (start, end) in enumerate(I): current_len = end - start result[idx, :current_len] = A[start:end]
运行后输出的result格式和你要求的完全匹配,示例I的输出为:
array([[ 1., 161., nan, nan, nan, nan], [ 51., 105., 143., nan, nan, nan], [ 2., 118., 127., nan, nan, nan], [ 37., 19., 4., 29., 13., 136.]])
如果需要整数类型的填充值,将初始化代码修改为如下即可:
# 示例用-1作为填充值 result = np.full((len(I), max_interval_len), -1, dtype=int)
方式2:不需要对齐,直接生成不同长度的子列表
如果不需要统一长度,直接用列表推导式一行即可实现:
result_list = [A[start:end].tolist() for start, end in I]
输出为:
[[1, 161], [51, 105, 143], [2, 118, 127], [37, 19, 4, 29, 13, 136]]
内容的提问来源于stack exchange,提问作者PavelP
相关产品推荐
相关产品推荐

