亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 778 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號