在pylab程序中(也可能是一个matlab程序)我有一个代表距离的数字numpy数组: d[t]
是时间 t
的距离(我的数据的时间 Span 是 len(d)
时间单位) .
事件我很容易得到 b = d<threshold
的布尔数组,问题归结为计算 b
中纯真词的长度序列 . 但我不知道如何有效地做到这一点(即使用numpy原语),并且我使用数组并进行手动更改检测(即当值从False变为True时初始化计数器,只要值为True就增加计数器,当值返回False时,将计数器输出到序列 . 但这非常缓慢 .
How to efficienly detect that sort of sequences in numpy arrays ?
下面是一些说明我的问题的python代码:第四个点需要很长时间才能出现(如果没有,增加数组的大小)
from pylab import *
threshold = 7
print '.'
d = 10*rand(10000000)
print '.'
b = d<threshold
print '.'
durations=[]
for i in xrange(len(b)):
if b[i] and (i==0 or not b[i-1]):
counter=1
if i>0 and b[i-1] and b[i]:
counter+=1
if (b[i-1] and not b[i]) or i==len(b)-1:
durations.append(counter)
print '.'
5 回答
虽然不是
numpy
原语,itertools
函数通常非常快,所以请尝试这个(并且测量各种解决方案的时间,当然包括这个):如果确实需要列表中的值,那么当然可以使用list(runs_of_ones(bits));但也许列表理解可能会略微加快:
转向“numpy-native”的可能性,那么:
再次:确保在实际的示例中针对彼此对比解决方案!
万一有人好奇(因为你传递了MATLAB),这里有一种方法可以在MATLAB中解决它:
我对Python不太熟悉,但也许这可以帮助你提供一些想法 . =)
适用于任何阵列的完全numpy矢量化和通用RLE(也适用于字符串,布尔值等) .
输出运行长度,起始位置和值的元组 .
很快(i7):
多种数据类型:
与Alex Martelli相同的结果如上:
比Alex慢一点(但速度非常快),而且更加灵活 .
这是一个仅使用数组的解决方案:它采用包含bool序列的数组并计算转换的长度 .
sw
包含true,其中有一个开关,isw
在索引中转换它们 . 然后在lens
中成对地减去isw的项目 .请注意,如果序列以1开始,它将计算0s序列的长度:这可以在索引中修复以计算镜头 . 另外,我没有测试过角情况,例如长度为1的序列 .
完整函数,返回所有
True
-subarrays的起始位置和长度 .测试了不同的bool 1D阵列(空数组;单个/多个元素;偶数/奇数长度;以
True
/False
开头;仅包含True
/False
元素) .