我看ç€this answer那里,他们有一个éžå¸¸èªæ˜Žçš„解决方案,å¯ä»¥æ‰¾åˆ°æœ€å¤§è·Œå¹…å¼€å§‹çš„ç‚¹ï¼Œæœ€å¤§è·Œå¹…æ˜¯æœ€ä½Žç‚¹ã€‚ä½†æ˜¯ï¼Œæ ¹æ®Wikipedia,这还ä¸æ˜¯ç»“æŸæ—¶é—´ï¼ˆå¦‚ç”案ä¸æ‰€è¿°ï¼‰ã€‚周期结æŸæ˜¯æ‚¨è¾¾åˆ°ç¼©æ°´æœŸå¼€å§‹ä¹‹å‰çš„峰值时。
è¿™æ„味ç€ç¼©æ°´æœŸå¯¹æˆ‘链接的ç”案ä¸ç»™å‡ºçš„图形没有终点。我æ£åœ¨å°è¯•ç¼–写å¯ä»¥è§£å†³æ¤é—®é¢˜çš„代ç ,在两ç§æƒ…况下,{1)有结æŸæ—¶é—´ï¼Œ2)没有结æŸæ—¶é—´}。
如果å¥å·æ°¸è¿œä¸ä¼šç»“æŸï¼Œæˆ‘åªå¸Œæœ›å®ƒè¿”回数组的最åŽä¸€ä¸ªç´¢å¼•ï¼ˆå› æ¤åŸºæœ¬ä¸Šæ˜¯æ•°ç»„的长度),如果å¥å·ç¡®å®žç»“æŸäº†ï¼Œæˆ‘想è¦æ£ç¡®çš„索引。这是一个简化的示例,其ä¸æˆ‘å°è¯•è§£å†³ç¬¬ä¸€ç§æƒ…况-当它有结æŸæ—¶é—´æ—¶ï¼š
import numpy as np
an_array = [21, 22, 23, 40, 19, 35, 37, 45, 42, 39, 28]
running_maximum = np.maximum.accumulate(an_array)
# running_maximum = [21, 22, 23, 40, 40, 40, 40, 45, 45, 45, 45]
bottom_index = np.argmax(running_maximum - an_array)
start_index = np.argmax(an_array[:bottom_of_period])
# bottom_index = 4, start_index = 3
difference = running_maximum - an_array
# difference = [0, 0, 0, 0, 21, 5, 3, 0, 3, 6, 17]
我之所以计算difference
æ˜¯å› ä¸ºå®ƒå¾ˆå®¹æ˜“çœ‹åˆ°end_index=7
ã€‚è¿™æ˜¯å› ä¸ºæœ€å¤§è·Œå¹…åœ¨ç´¢å¼•4处为21,并且由于difference=0
在索引7处å†æ¬¡å‡ºçŽ°ï¼Œè¿™æ„味ç€æˆ‘å†æ¬¡è¶…过(或刚刚达到)我的峰值。我å°è¯•ç¼–写np.argmin(difference[bottom_index:])
æ¥èŽ·å–索引,但是由于我对å‘é‡difference
è¿›è¡Œäº†åˆ‡ç‰‡ï¼Œå› æ¤è¿™å½“然ä¸ä¼šç»™æˆ‘7,而是给了我3,这是ä¸æ£ç¡®çš„。
关于如何解决æ¤é—®é¢˜çš„任何技巧,并使其在没有结æŸæ—¶é—´çš„情况下返回最åŽä¸€ä¸ªç´¢å¼•ï¼Œè¿™å°†æ˜¯ä»¤äººæƒŠè®¶çš„。
ç”案 0 :(得分:0)
我认为这å¯ä»¥è§£å†³ï¼›
import numpy as np
an_array = [21, 22, 23, 40, 19, 35, 37, 45, 42, 39, 28]
running_maximum = np.maximum.accumulate(an_array)
difference = running_maximum - an_array
bottom_index = np.argmax(difference)
start_index = np.argmax(an_array[:bottom_index])
if difference[bottom_index:].__contains__(0):
end_index = len(difference[:bottom_index]) + np.argmin(difference[bottom_index:])
else:
end_index = len(difference)
使用给定的示例数组,我得到end_index = 7
。如果我更改an_array[4]=39
,最大的缺点将ä¸å†ç»“æŸï¼Œè€Œæˆ‘得到end_index = 11
。ä¸ç¡®å®š__contains__(0)
是å¦æœ‰æ•ˆã€‚