加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在大型numpy数组中查找常量子数组

发布时间:2020-12-20 12:03:45 所属栏目:Python 来源:网络整理
导读:我有一个像numpy浮点数组 v = np.array([1.0,1.0,2.0,...]) 我需要识别数组中的所有常量段 [{value:1.0,location:0,duration:2},..] 效率是主要指标 解决方法 这是一种方法 – def island_props(v): # Get one-off shifted slices and then compare element-
我有一个像numpy浮点数组

v = np.array([1.0,1.0,2.0,...])

我需要识别数组中的所有常量段

[{value:1.0,location:0,duration:2},..]

效率是主要指标

解决方法

这是一种方法 –

def island_props(v):
    # Get one-off shifted slices and then compare element-wise,to give
    # us a mask of start and start positions for each island.
    # Also,get the corresponding indices.
    mask = np.concatenate(( [True],v[1:] != v[:-1],[True] ))
    loc0 = np.flatnonzero(mask)

    # Get the start locations
    loc = loc0[:-1]

    # The values would be input array indexe by the start locations.
    # The lengths woul be the differentiation between start and stop indices.
    return v[loc],loc,np.diff(loc0)

样品运行 –

In [143]: v
Out[143]: array([ 1.,1.,2.,5.,2.])

In [144]: value,location,lengths = island_props(v)

In [145]: value
Out[145]: array([ 1.,2.])

In [146]: location
Out[146]: array([0,2,6,7])

In [147]: lengths
Out[147]: array([2,4,1,1])

运行时测试

其他方法 –

import itertools
def MSeifert(a):
    return [{'value': k,'duration': len(list(v))} for k,v in 
             itertools.groupby(a.tolist())]

def Kasramvd(a):
    return np.split(v,np.where(np.diff(v) != 0)[0] + 1)

计时 –

In [156]: v0 = np.array([1.0,5.0,2.0])

In [157]: v = np.tile(v0,10000)

In [158]: %timeit MSeifert(v)
     ...: %timeit Kasramvd(v)
     ...: %timeit island_props(v)
     ...: 
10 loops,best of 3: 44.7 ms per loop
10 loops,best of 3: 36.1 ms per loop
10000 loops,best of 3: 140 μs per loop

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读