如何用Python垂直拆分numpy数组列:基于连续零的拆分需求
解决方案
1. 定位拆分点
利用numpy的卷积操作检测连续三个零的位置,提取每个连续零块的最后一个索引作为拆分起始点:
import numpy as np # 示例输入数组 arr = np.array([0,1,4,2,3,4,7,0,6,0,0,0,6,4,6,3,0,0,0,7]) # 用卷积窗口检测连续3个零 window = np.ones(3, dtype=int) convolved = np.convolve(arr == 0, window, mode='valid') # 获取连续三个零的最后一个元素索引 split_starts = np.where(convolved == 3)[0] + 2 # 补充数组开头作为第一个块的起始,末尾作为结束标记 split_points = np.insert(split_starts, 0, 0) split_points = np.append(split_points, len(arr))
2. 拆分并提取目标块
遍历拆分点,截断冗余的零,保留每个块的起始零:
blocks = [] for i in range(len(split_points)-1): start = split_points[i] # 非最后一块时,截断掉连续三个零的前两个,只保留最后一个作为下一块起始 if i < len(split_points)-2: end = split_points[i+1] - 2 block = arr[start:end] else: block = arr[start:split_points[i+1]] blocks.append(block)
3. 验证拆分结果
打印拆分后的列数据:
for idx, block in enumerate(blocks, 1): print(f"列{idx}:") print(block)
输出结果:
列1: [0 1 4 2 3 4 7 0 6] 列2: [0 6 4 6 3] 列3: [0 7]
4. 并行图表绘制
用matplotlib将各段数据并行展示,对应目标图表效果:
import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) for idx, block in enumerate(blocks, 1): plt.plot(block, label=f'列{idx}') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者JetskiS
相关产品推荐
相关产品推荐

