Numpy:在给定开始和持续时间列表的时间t找到活动门票的数量

时间:2012-08-08 17:16:51

标签: python numpy

我有一个元组列表,代表一张票的开始时间及其持续时间

tickets = [(start1, duration1), (start2, duration2),...]

我想知道在给定时间t有多少票有效。

虚拟功能:

def activity(t, tickets):
    tickets.sort()
    gamma = 0
    for point, duration in tickets:
    if point < t and t < point + duration:
        gamma += 1
    return gamma
如果你想计算一个增加时间的向量的活动,那么

花费太多时间并且是愚蠢的。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

使用内置

def activity(t):
       return  len(filter(lambda x:x[0]<t<x[0]+x[1],tickets))

过滤器在较低级别完成并且优化得比for循环更优化所以它应该更快......它不依赖于排序而只返回剩下的数量

使用numpy

import numpy as np
tickets = np.array([(start1, duration1), (start2, duration2),...])

def activity(t,tickets):
    t1 = tickets[tickets[:,0]<t] #start times before t
    return t2[t2[:,0]+t2[:,1]>t]   #start+duration after t

使用您的代码,因为它已经排序,您可以在start大于t时始终退出循环,因此您不会评估所有项目

def activity(t, tickets):
    tickets.sort(key=lambda x:x[0]) #sort by start time
    gamma = 0
    for point, duration in tickets:
        if point < t and t < point + duration:
              gamma += 1
        elif point > t:
              break ; #we can quit looking
    return gamma

您还可以预先排序列表并确保在已排序的位置插入项目(保持列表排序,这样您就不必每次都对其进行排序)

[编辑]更新以更正numpy功能

>>> x=np.array([(1,2),(2,2),(1,4),(1,1),(3,2)])
>>> x
array([[1, 2],
       [2, 2],
       [1, 4],
       [1, 1],
       [3, 2]])
>>> def activity(t,tickets):
...     tmp = tickets[tickets[:,0] < t]
...     return tmp[tmp[:,0]+tmp[:,1] > t]
...
>>> activity(2,x)
array([[1, 2],
       [1, 4]])
>>> activity(3,x)
array([[2, 2],
       [1, 4]])