我开始编码"真实"在Matlab回到2000年。当你创建一个数组时,你可以简单快速地搜索该数组的键。就像这样:
found_keys = find(my_array(:, 1) > start_time & my_array(:, 1) < end_time)
其中my_array是一个数组(矩阵),第一列是本例中的时间戳。返回将是一个大于start_time且小于end_time的时间戳列表。然后我可以循环遍历found_keys来处理my_array中相关的数据。
我现在正在使用具有时间戳的数据在Python中工作,并且我试图匹配来自2个不同来源的数据,这些来源报告他们在不同时区的时间但不知道这些时区是什么。来自两个来源的数据由大量(40k和10K)个别事件组成。 10K表示两个来源报告的个别事件。这两个来源共享3个具有相同值的字段。
理想情况下,我会确定来自10k源的单个事件的时间戳。然后我会创建一个时间窗口 - +/- 12小时,它将为我的搜索定义start_time和end_time。然后,我只搜索40k源中具有start_time和end_time之间时间戳的单个事件。
在Matlab中非常容易,但在Python中,我必须使用OrderedDict来获取从低到高排序的时间戳键。我仍然不知道任何与Matlab具有的查找功能相同的东西。因此,对于10k事件中的每一个,我都会在40k源代码中循环。显然,一旦我找到一个匹配,我可以踢出循环,甚至从字典中弹出值,但这只会加速搜索。被命令我也可以在时间戳大于end_time之后退出循环。但是,这些简单的优化还有很多不足之处。
虽然我目前的40k和10k的数据集并不是那么庞大,但我不能只进行大搜索并等待一段时间才能得到更快的方法。
有什么想法吗?
---编辑显示结果:02/25/2015 ---
我偏爱词典理解,因为最终结果是我需要下游代码的值的字典。而且时间足够快,以至于它并不重要。然而,到目前为止,numpy解决方案是最快的。以下是数字:
所有3个解决方案提供了相同的答案。对于我的测试,它将43,477个别事件减少到49个。如果我只运行了几次,并且所有解决方案都是完全足够的,但我可以运行这个代码数千次,因此numpy和其他所有内容之间的区别变为重要的。
答案 0 :(得分:0)
如果你有一个list
(一个可以处理多种类型的数组),你可以使用list comprehension来获取它们!您可以执行以下操作:
new_list = [something(i) for i in list if condition]
这是基本语法。结合比较链(x > y >= z
等)
found_keys = [i for i in my_array if end_time > i > start_time]
将是您的列表,其中my_array
是时间戳列表。
答案 1 :(得分:0)
如果你可以使用numpy数组而不是OrderedDict,那么语法非常接近Matlab的语法。
例如,您的示例行变为:
found_keys = numpy.where((my_array[:, 0] > start_time)*(my_array[:, 0] < end_time))[0]
请注意,Matlab的&
在Python中更改为*
,但numpy也包含logical_and,它们也会这样做。
答案 2 :(得分:0)
使用Dict理解,这类似于列表理解,但对于dicts。
data = {0: 'w', 1: 's', 2: 'e', 3: 'r', 4: 'v', 5: 'a', 6: 's', 7: 'r', 8: 'e', 9: 'w', 10: 'v', 11: 'a', 12: 's'}
start_timestamp = 3
end_timestamp = 6
filtered_data = {k:v for k, v in data.iteritems() if k > start_timestamp and k < end_timestamp}
结果:
{4: 'v', 5: 'a'}