有一个(time, count)
值列表的图形可视化,其中x轴上的时间和y轴上的计数。
list_1 = [(1, 50000), (2,40000), (3,20000), (4,10000), (5, 5000), (6, 3000), (7,500), (8, 10), (9,100), (10,2000), (11,5000),(11,8000),(12,10000), (13,20000)]
我的目的是找出计数增加超过或等于limit = 20000
的时间,即沿增加坡面的(13,20000)
,而不是减少坡面。
我写了一个伪代码,它做同样的事情,但没有有效的方式。
但是有一个约束是list_1不是固定值,而是使用f(时间、计数)的新值不断地递增。
def find_limit():
list_1 = [(1, 50000), (2, 40000), (3, 20000), (4, 10000), (5, 5000), (6, 3000), (7, 500), (8, 10), (9, 100),
(10, 2000), (11, 5000), (11, 8000), (12, 10000), (13, 20000)]
found = False
limit = 20000
for time, count in list_1:
if count < limit:
found = True
if found:
if count >= limit:
return time
print(find_limit())
还有什么其他方法可以让我在列表不断更新时,计数超过阈值的时间增加吗?
发布于 2020-01-14 19:21:16
使用numpy
import numpy as np
limit = 20000
list_1 = np.array([(1, 50000), (2, 40000), (3, 20000), (4, 10000), (5, 5000), (6, 3000), (7, 500), (8, 10), (9, 100),
(10, 2000), (11, 5000), (11, 8000), (12, 10000), (13, 20000)])
res=list_1[((list_1[:-1,1]<limit)&(list_1[1:,1]>=limit)).argmax()+1,:]
#list_1[((list_1[:-1,1]<limit)&(list_1[1:,1]>=limit)).argmax()+1,0] in order to get just 13
简言之:
((list_1[:-1,1]<limit)&(list_1[1:,1]>=limit))
将返回布尔向量,并对两个连续的数字进行比较,以确定它们之间是否交叉了limit
。左边部分从索引0到最后一个元素,而右边部分从索引1到最后一个元素,有各自的条件。
接下来- argmax()
将返回满足这两种条件的第一个索引,并且我们需要添加1,因为我们想要得到已经越过线的索引,而不是以前的索引。
输出:
[ 13 20000]
发布于 2020-01-14 19:12:22
IIUC
list_1 = [(1, 50000), (2,40000), (3,20000), (4,10000), (5, 5000), (6, 3000), (7,500),
(8, 10), (9,100), (10,2000), (11,5000),(11,8000),(12,10000), (13,20000)]
df = pd.DataFrame(list_1, columns=['time', 'count'])
# Set the limit
limit = 20_000
times_over_limit = df[df['count'] < limit]['time'].tolist()
# List of times for which count is less than limit value
times_over_limit
[4, 5, 6, 7, 8, 9, 10, 11, 11, 12]
https://stackoverflow.com/questions/59740039
复制相似问题