在 pylab 程序(也可能是 matlab 程序)中,我有一个代表距离的 numpy 数字数组: d[t]
是时间的 距离 t
(以及我的时间跨度数据是 len(d)
时间单位)。
我感兴趣的事件是距离低于某个阈值时,我想计算这些事件的持续时间。使用 b = d<threshold
很容易得到一个布尔数组,问题归结为计算 b
中只为真字的长度序列。但我不知道如何有效地做到这一点(即使用 numpy 基元),我求助于遍历数组并进行手动更改检测(即当值从 False 变为 True 时初始化计数器,只要值为 True 就增加计数器,并在值返回到 False 时将计数器输出到序列)。但这非常慢。
如何有效地检测 numpy 数组中的那种序列?
下面是一些 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 '.'
原文由 Gyom 发布,翻译遵循 CC BY-SA 4.0 许可协议
虽然不是
numpy
原语,itertools
函数通常非常快,所以一定要试试这个(当然还要测量包括这个在内的各种解决方案的时间):如果您确实需要列表中的值,当然可以使用 list(runs_of_ones(bits));但也许列表理解可能会稍微快一些:
转向“numpy-native”的可能性,怎么样:
再次强调:一定要在适合您的实际示例中相互比较解决方案!