如何在分割数组时定位标记点的段序号与段内索引?
问题描述
我有一个单列的pandas DataFrame:
import pandas as pd df = pd.DataFrame({"Value": [10,9,5,11,2,8,6,7,4,2,1,9]})
当取其子集后,索引变为3,4,5,6,7:
df = df[3:8]
使用.to_numpy()转换为numpy数组时,索引会重置为0,1,2,3,4,但我需要保留原DataFrame的索引3,4,5,6,7。
补充背景:
- 我有一个含2880个索引点的numpy数组,需在索引1440处设置标记点。
- 需要将主数组分割为任意数量的段(如100段),找出标记点所在的段序号及该段内的索引。
- 当前分割代码如下:
# Convert pandas df to numpy array signal = df['value'].values # Split the signal into n no. of parts num_parts = 100 segment_length = len(signal) // num_parts segments = [signal[i:i + segment_length] for i in range(0, len(signal), segment_length)]
解决方案
一、保留原DataFrame索引的方法
如果需要同时保留原始索引和对应的值,有两种直接的实现方式:
1. 单独提取索引数组与值数组配对
直接将切片后的DataFrame索引转为numpy数组,和值数组对应存储即可:
# 获取切片后的子集 df_subset = df[3:8] # 提取原始索引数组 original_indices = df_subset.index.to_numpy() # 提取值数组 values = df_subset['Value'].to_numpy()
后续可通过两个数组的对应位置,获取每个值对应的原始索引。
2. 使用结构化数组存储索引和值
如果希望将索引和值整合到同一个numpy数组中,可以创建结构化数组:
import numpy as np df_subset = df[3:8] # 创建包含索引和值的结构化数组 structured_array = np.array( list(zip(df_subset.index, df_subset['Value'])), dtype=[('original_index', int), ('value', int)] )
之后可通过structured_array['original_index']和structured_array['value']分别访问索引和对应的值。
二、分割数组并定位标记点的实现
针对补充背景中的需求,无需先将DataFrame转为纯值数组,可直接基于原始索引处理,或在分割时保留索引信息:
方法1:基于pandas分割(推荐)
利用索引范围直接分割,逻辑更清晰:
import pandas as pd # 模拟含2880个索引点的DataFrame df = pd.DataFrame({"Value": range(2880)}, index=range(2880)) target_index = 1440 num_parts = 100 # 计算每段的基础长度 segment_length = len(df) // num_parts # 生成所有段的索引范围 segment_ranges = [(i, i + segment_length - 1) for i in range(0, len(df), segment_length)] # 处理最后一段可能长度不足的情况 if segment_ranges[-1][1] < df.index[-1]: segment_ranges[-1] = (segment_ranges[-1][0], df.index[-1]) # 遍历查找标记点所在的段 for seg_idx, (start_idx, end_idx) in enumerate(segment_ranges): if start_idx <= target_index <= end_idx: within_segment_idx = target_index - start_idx print(f"标记点位于第{seg_idx+1}段(从1开始计数),段内索引为{within_segment_idx}") break
方法2:基于numpy数组保留索引信息
如果必须使用numpy数组,可先将索引和值整合后再分割:
import numpy as np import pandas as pd # 模拟数据 df = pd.DataFrame({"Value": range(2880)}, index=range(2880)) target_index = 1440 num_parts = 100 # 生成包含索引和值的numpy数组 signal_with_index = np.array( list(zip(df.index, df['Value'])), dtype=[('index', int), ('value', int)] ) segment_length = len(signal_with_index) // num_parts segments = [signal_with_index[i:i+segment_length] for i in range(0, len(signal_with_index), segment_length)] # 遍历段查找标记点 for seg_num, seg in enumerate(segments): if (seg['index'] >= target_index).any() and (seg['index'] <= target_index).any(): within_seg_idx = np.where(seg['index'] == target_index)[0][0] print(f"标记点位于第{seg_num+1}段,段内索引为{within_seg_idx}") break
内容的提问来源于stack exchange,提问作者EnigmAI
相关产品推荐
相关产品推荐

