为了账号安全,请及时绑定邮箱和手机立即绑定

在numpy数组中找到相同值的序列的长度(游程长度编码)

在numpy数组中找到相同值的序列的长度(游程长度编码)

慕勒3428872 2019-12-02 09:55:54
在pylab程序中(也可能是matlab程序),我有一个代表距离的数字的numpy数组:d[t]是时间上的距离t(我的数据的时间跨度是len(d)时间单位)。我感兴趣的事件是距离小于某个阈值时,并且我想计算这些事件的持续时间。使用轻松获得布尔数组很容易b = d<threshold,问题归结为计算中的True-only单词的长度顺序b。但是我不知道如何有效地做到这一点(即使用numpy原语),我求助于遍历数组并进行手动更改检测(即,当值从False变为True时初始化计数器,只要value为True便增加计数器,并在值返回False时将计数器输出到序列。但这非常慢。如何有效地检测numpy数组中的那种序列?以下是一些说明我的问题的python代码:第四个点需要很长时间才能显示(如果没有,请增加数组的大小)from pylab import *threshold = 7print '.'d = 10*rand(10000000)print '.'b = d<thresholdprint '.'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 '.'
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

尽管不是numpy原始itertools函数,但函数通常非常快,因此请尝试一下(当然,还要测量包括该函数在内的各种解决方案的时间):


def runs_of_ones(bits):

  for bit, group in itertools.groupby(bits):

    if bit: yield sum(group)

如果确实需要列表中的值,那么当然可以使用list(runs_of_ones(bits));但也许列表理解仍然会稍微快一些:


def runs_of_ones_list(bits):

  return [sum(g) for b, g in itertools.groupby(bits) if b]

转向“ numpy-native”的可能性,那么:


def runs_of_ones_array(bits):

  # make sure all runs of ones are well-bounded

  bounded = numpy.hstack(([0], bits, [0]))

  # get 1 at run starts and -1 at run ends

  difs = numpy.diff(bounded)

  run_starts, = numpy.where(difs > 0)

  run_ends, = numpy.where(difs < 0)

  return run_ends - run_starts

再说一遍:请确保在为您量身定制的示例中相互比较基准解决方案!


查看完整回答
反对 回复 2019-12-02
  • 3 回答
  • 0 关注
  • 760 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号