You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在NumPy数组列中查找3个及以上连续值并提取对应行指定列值

如何在NumPy数组中查找连续重复序列并提取对应列的值

我来帮你搞定这个问题!需求很清晰——咱们要扫描NumPy数组的某一列,找出有3个及以上连续相同值的序列,然后从另一指定列里提取该序列起始和结束位置的值。下面我就用你给的示例一步步实现。

首先,先把你的示例列表转换成NumPy数组(毕竟NumPy处理数值数组的效率和便利性拉满):

import numpy as np

arr = np.array([
    [2, 7, 2, 1],
    [1, 2, 3, 4],
    [4, 6, 6, 4],
    [8, 2, 6, 4],
    [9, 3, 1, 4],
    [2, 7, 2, 1]
])

接下来咱们拆解核心逻辑:

  1. 先把要扫描的列(你说的第4列,注意NumPy是0索引,所以对应索引3)提取出来
  2. 找出该列中连续等于目标值(这里是4)的序列,只留长度≥3的
  3. 对符合条件的序列,从指定提取列(你说的第2列,对应索引2)取出起始和结束值

直接上实现代码,我会在后面解释关键步骤:

# 先定义好参数,方便后续修改
scan_col = 3       # 要扫描的列(1-based第4列 → 0-based索引3)
target_val = 4     # 要查找的连续值
extract_col = 2    # 要提取值的列(1-based第2列 → 0-based索引2)

# 提取扫描列的所有值
scan_arr = arr[:, scan_col]

# 创建标记数组:等于目标值的位置设为1,其他为0,这样连续的1就是咱们要找的连续序列
mask = (scan_arr == target_val).astype(int)

# 用差分操作找连续序列的起止点:当值从0变1时是起点,从1变0时是终点
diff_mask = np.diff(mask, prepend=0, append=0)
starts = np.where(diff_mask == 1)[0]    # 所有连续序列的起始索引
ends = np.where(diff_mask == -1)[0] - 1 # 所有连续序列的结束索引(减1是因为差分的位置在序列结束的下一位)

# 筛选出长度≥3的连续序列
valid_seq_indices = np.where((ends - starts + 1) >= 3)[0]

# 提取对应列的起始和结束值
result = []
for idx in valid_seq_indices:
    start_val = arr[starts[idx], extract_col]
    end_val = arr[ends[idx], extract_col]
    result.append([start_val, end_val])

# 转成NumPy数组输出
result_arr = np.array(result)
print(result_arr)

运行这段代码后,你会得到输出:

[[3 1]]

完全符合你示例里期望的结果!

关键步骤解释

  • mask数组:把扫描列里符合目标值的位置标记为1,这样连续的1就直观代表了连续的目标值序列,方便后续识别。
  • diff_mask差分操作:通过计算相邻元素的差值,我们能精准定位连续序列的起点(差值为1,代表从0变1)和终点(差值为-1,代表从1变0),调整终点索引时减1是因为差分的结果对应在序列结束的下一个位置。
  • 筛选有效序列:计算每个连续序列的长度(结束索引-起始索引+1),只保留长度≥3的序列,避免短序列干扰。
  • 提取结果:遍历所有有效序列,从指定提取列中取出起始和结束位置的值,最后转成NumPy数组存储。

如果你的数组里有多个符合条件的连续序列,这段代码也能全部捕捉到并提取对应的值哦。

内容的提问来源于stack exchange,提问作者JustSomeDude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:47:35