You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用NumPy将数组拆分为元素差值为1的连续子数组

解决NumPy数组按连续差值为1拆分的问题

嘿,你已经迈出了正确的第一步——找到了数组中元素不连续的分界点!接下来只需要把这些分界点转化为拆分位置,就能轻松得到你想要的连续子数组了,而且完全不需要提前确定子数组的数量,我来给你一步步演示:

步骤1:确定拆分位置

你用np.where(a[1:]-a[:-1]>1)得到的是原数组前n-1个元素中,相邻元素差值大于1的索引。比如在你的示例数组里,这个结果会是array([3, 7]),对应的是原数组中13(索引3)和22、25(索引7)和30之间的分界。

但要注意:我们需要的拆分位置是在这两个元素的后面,也就是原数组的索引48,所以要给得到的索引加1:

import numpy as np

a = np.array([10,11,12,13,22,23,24,25,30,31,32,33,34])

# 获取拆分位置:给分界索引加1,得到原数组中的拆分点
split_positions = np.where(a[1:] - a[:-1] > 1)[0] + 1

步骤2:拆分数组

np.split()函数传入原数组和拆分位置,它会自动把数组拆分成对应数量的子数组:

# 执行拆分
subarrays = np.split(a, split_positions)

# 查看结果(和你预期的逻辑一致)
for idx, arr in enumerate(subarrays, 1):
    print(f"array{idx} = np.array({arr.tolist()})")

运行这段代码后,输出会是:

array1 = np.array([10, 11, 12, 13])
array2 = np.array([22, 23, 24, 25])
array3 = np.array([30, 31, 32, 33, 34])

(哦对了,你的预期里array1写的是[10,11,12],但原数组里13和前面的元素差值也是1,所以实际拆分出来的array1会包含13,如果是笔误的话,调整原数组或者拆分条件就行~)

为什么这个方法可行?

  • np.split()支持传入任意数量的拆分位置,不管你有多少个连续子数组,它都能正确处理
  • 拆分位置的计算逻辑完全匹配“相邻元素差值大于1”的分界规则,确保每个子数组内的元素都是连续差值为1的序列

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

火山引擎 最新活动