python - 查找两个最大且不连续值的索引
问题描述
给定以下向量,
a = [0, 11, 22, 10, 5, 6, 7, 8, 9, 23, 25, 18, 10]
我需要识别“a”的索引,其元素是两个最大的非连续值,如下所示:
idx = [2, 10]
(a[2] = 22;a[10] = 25)。
此外,可以在这些发现数字之间设置最小距离间隙(my_gap);例如在以下向量中,
a = [10, 11, 14, 28, 10, 30, 8, 11, 13, 11, 28, 10]
我想拥有:idx= [5, 10]
因为我希望在至少 3 的最大值之间有一个位置差距。在示例中,第一个“28”与“30”太接近(它们相差 5-2=3 个位置,其他 '28' 离 '30' 更远 -->abs(5-10) = 5 > my_gap)。
为了更准确并避免误解,是否有任何 Pythonic 方法来重写以下代码?谢谢
import numpy as np
a = [60, 2, 3, 21, 18, 22, 0, 70, 118, 111, 100, 120, 10, 6]
idx = np.argsort(a)[::-1]
a_sorted = np.sort(a)[::-1]
n_gap = 3
first_value = a_sorted[0]
second_value = []
for i in range(1, len(idx)):
if abs(idx[0] - idx[i]) > n_gap:
second_value = a_sorted[i]
break
print('first value: ', first_value)
print('second value: ', second_value)
解决方案
线性复杂度版本。
大约 O(N) 时间和恒定空间
它的工作原理是建立一个最大值到每个索引的列表,
然后检查每个元素和最大值到(当前元素的索引 - k),
这是因为最大值到(这个索引 - k)将是当前元素的最佳配对,最大配对必须包含列表的最大值。
a = ([0, 11, 22, 10, 5, 6, 7, 8, 9, 23, 25, 18, 10],
[10, 11, 14, 28, 10, 30, 8, 11, 13, 11, 28, 10],
[20, 21, 19, 18, 17],
[10,8,9,11,12],
[0, 0, 0, 10, 15, 16, 15, 0, 0, 0, 11,13,15,12,10],
[60, 2, 3, 21, 18, 22, 0, 70, 118, 111, 100, 120, 10, 6])
n_gap = 3 #minimum distance
k = n_gap + 1 # k is position offset, which is 1 more than gap size
for a in a:
if(len(a) <= k): # not enough elements for gap size
print('no answer')
continue
m = a[0]
mi = 0
maxes = (m, a[k], mi, k)
for i,x in enumerate(a):
if x > m: #new maximum found
if i >= k: #index big enough to have a pair
mit, mt = a[i - k] #get incremental maximum at gap
maxes = (x, mt, i, mit) #init maxes with max pair candidate
mi, m = i, x #track new maximum
else:
if i - mi >= k: #gap from last maximum big enough
mit, mt = a[i - k] #get incremental maximum at gap
maxes = max(maxes,(mt, x, mit, i)) #check max pair candidate
a[i] = (mi, m) # fill [a] with incremental maximums
print(maxes) #find maximum pair candidate
推荐阅读
- android - onSaveInstanceState 和 onRestoreInstanceState 不恢复列表视图状态
- mysql - 由于维护,Compute Engine 上的 MySQL 未正确关闭
- substrate - Substrate transaction per second performance
- apache-kafka - Producer 如何决定它必须将消息放在哪个 Partition 中?
- python - 模拟量子谐振子/SHM
- sql - bacth 文件中的 SQL Server 查询
- c# - 如何修复错误 Endpoint not found WCF REST POST
- python - Python Pandas 数据框到字典(列值到键/值)
- javascript - 如何更改 Apexcharts RadialBar Charts 中未进度条的颜色?
- kubernetes - 有没有办法将 statefulset 名称传递到文件中,该文件安装到相同 statefulset 的 configmap 中?