获取Numpy数组中两个山丘的起始与结束索引
信息说明
现有如下NumPy数组:
[ 23 22 21 22 21 22 23 23 23 21 21 22 22 22 22 22 22 22 22 22 21 21 22 22 22 22 23 22 22 21 21 20 20 19 19 19 19 19 19 19 19 20 21 22 23 23 23 22 22 22 22 21 20 20 19 19 19 19 19 19 19 19 19 19 20 20 21 21 23 24 24 25 25 26 26 25 24 24 24 24 23 23 23 23 23 22 21 20 19 19 19 18 18 18 18 18 19 18 18 18 18 18 18 18 18 18 18 17 17 17 17 17 17 18 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 18 18 18 17 16 16 16 15 14 15 14 14 15 15 16 16 16 16 16 15 15 15 14 14 14 14 14 13 13 13 13 13 13 11 11 10 10 11 9 9 8 9 11 11 12 12 10 10 10 11 12 12 12 13 15 14 14 12 14 13 18 24 32 40 51 63 62 68 78 82 90 92 93 95 96 106 112 118 123 123 125 130 134 136 137 138 140 144 148 153 158 163 163 163 159 161 164 165 163 166 176 179 184 190 200 207 210 213 214 216 218 221 228 233 236 237 238 238 241 243 243 243 243 242 236 208 192 177 165 163 160 152 148 143 130 121 113 94 81 61 53 48 41 31 30 29 28 21 19 13 5 3 7 9 9 10 9 10 10 10 10 10 10 9 10 10 10 10 10 10 11 11 13 16 21 22 21 22 22 26 24 22 22 19 19 19 19 19 19 24 32 40 47 49 58 62 65 63 70 79 82 84 89 93 95 96 101 105 105 111 111 117 117 117 118 122 123 126 128 133 134 138 141 150 154 157 159 160 160 160 173 183 201 220 227 241 253 254 266 272 272 271 276 278 280 284 285 284 271 262 248 247 248 252 253 256 259 266 266 266 258 256 268 265 271 278 281 288 285 286 277 266 250 240 207 180 137 99 92 82 81 82 80 81 80 80 80 77 77 78 79 75 73 72 72 71 72 70 71 73 73 72 70 71 70 69 68 68 70 67 65 64 65 64 63 63 63 63 63 61 62 62 62 62 63 63 63 63 63 63 63 63 64 61 60 62 61 60 60 60 60 60 60 59 57 57 55 55 53 52 50 49 47 46 44 44 42 40 39 37 36 32 30 27 24 25 26 22 18 6 7 7 8 11 12 17 18 20 20 20 19 20 20 20 19 20 21 22 21 24 22 22 20 20 19 19 17 17 16 17 15 15 15 14 14 15 13]

问题需求
自动获取该数组中左侧山丘与右侧山丘的起始索引和结束索引,提供Python函数实现方案或数学解决方法。
预期结果
left = [181, 284] right = [320, 502]

解决方案
思路分析
结合数据可视化图与预期结果,“山丘”指数组中数值大幅上升后形成的高值区域,与前后低值区域有明显分界。可通过以下步骤识别:
- 计算数组的梯度(相邻元素差值),定位数值从低到高的突变起始点,以及从高到低的突变结束点。
- 设置阈值过滤小幅度波动,仅保留显著的上升/下降突变。
- 结合数据特征筛选出两个目标山丘的区间。
Python实现(基于NumPy)
import numpy as np def find_hill_indices(arr): # 计算相邻元素的差值(梯度) grad = np.diff(arr) # 设定显著突变阈值(根据数据特征调整) rise_threshold = 20 fall_threshold = -20 # 找到显著上升的起始索引(梯度>阈值的位置+1,补全diff缺失的索引) rise_points = np.where(grad > rise_threshold)[0] + 1 # 找到显著下降的结束索引(梯度<阈值的位置) fall_points = np.where(grad < fall_threshold)[0] # 提取两个山丘的区间 left_hill = [rise_points[0], fall_points[0]] right_hill = [rise_points[1], fall_points[-1]] return left_hill, right_hill # 转换给定数组为NumPy格式 arr = np.array([23,22,21,22,21,22,23,23,23,21,21,22,22,22,22,22,22,22,22,22,21,21,22,22,22,22,23,22,22,21,21,20,20,19,19,19,19,19,19,19,19,20,21,22,23,23,23,22,22,22,22,21,20,20,19,19,19,19,19,19,19,19,19,19,20,20,21,21,23,24,24,25,25,26,26,25,24,24,24,24,23,23,23,23,23,22,21,20,19,19,19,18,18,18,18,18,19,18,18,18,18,18,18,18,18,18,18,17,17,17,17,17,17,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,18,18,18,17,16,16,16,15,14,15,14,14,15,15,16,16,16,16,16,15,15,15,14,14,14,14,14,13,13,13,13,13,13,11,11,10,10,11,9,9,8,9,11,11,12,12,10,10,10,11,12,12,12,13,15,14,14,12,14,13,18,24,32,40,51,63,62,68,78,82,90,92,93,95,96,106,112,118,123,123,125,130,134,136,137,138,140,144,148,153,158,163,163,163,159,161,164,165,163,166,176,179,184,190,200,207,210,213,214,216,218,221,228,233,236,237,238,238,241,243,243,243,243,242,236,208,192,177,165,163,160,152,148,143,130,121,113,94,81,61,53,48,41,31,30,29,28,21,19,13,5,3,7,9,9,10,9,10,10,10,10,10,10,9,10,10,10,10,10,10,11,11,13,16,21,22,21,22,22,26,24,22,22,19,19,19,19,19,19,24,32,40,47,49,58,62,65,63,70,79,82,84,89,93,95,96,101,105,105,111,111,117,117,117,118,122,123,126,128,133,134,138,141,150,154,157,159,160,160,160,173,183,201,220,227,241,253,254,266,272,272,271,276,278,280,284,285,284,271,262,248,247,248,252,253,256,259,266,266,266,258,256,268,265,271,278,281,288,285,286,277,266,250,240,207,180,137,99,92,82,81,82,80,81,80,80,80,77,77,78,79,75,73,72,72,71,72,70,71,73,73,72,70,71,70,69,68,68,70,67,65,64,65
相关产品推荐
相关产品推荐

