您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 使用随机长度的块生成1d numpy

5b51 2022/1/14 8:23:26 python 字数 2741 阅读 569 来源 www.jb51.cc/python

我需要生成一维数组,其中重复的整数序列由随机数的零分隔. 到目前为止,我正在使用下一个代码: from random import normalvariate regular_sequence = np.array([1,2,3,4,5], dtype=np.int) n_iter = 10 lag_mean = 10 # mean length of zeros sequence lag_sd

概述

到目前为止,我正在使用下一个代码

from random import normalvariate

regular_sequence = np.array([1,2,3,4,5],dtype=np.int)
n_iter = 10
lag_mean = 10 # mean length of zeros sequence
lag_sd = 1 # standard deviation of zeros sequence length

# Sequence of lags lengths
lag_seq = [int(round(normalvariate(lag_mean,lag_sd))) for x in range(n_iter)]

# Generate list of concatenated zeros and regular sequences
seq = [np.concatenate((np.zeros(x,dtype=np.int),regular_sequence)) for x in lag_seq]
seq = np.concatenate(seq)

当我需要很多长序列时它可以工作但看起来很慢.那么,我该如何优化呢?

# Size of regular_sequence
N = regular_sequence.size

# Use cumsum to pre-compute start of every occurance of regular_sequence
offset_arr = np.cumsum(lag_seq)
idx = np.arange(offset_arr.size)*N + offset_arr

# Setup output array
out = np.zeros(idx.max() + N,dtype=regular_sequence.dtype)

# Broadcast the start indices to include entire length of regular_sequence
# to get all positions where regular_sequence elements are to be set
np.put(out,idx[:,None] + np.arange(N),regular_sequence)

运行时测试 –

def original_app(lag_seq,regular_sequence):
    seq = [np.concatenate((np.zeros(x,regular_sequence)) for x in lag_seq]
    return np.concatenate(seq)

def vectorized_app(lag_seq,regular_sequence):
    N = regular_sequence.size       
    offset_arr = np.cumsum(lag_seq)
    idx = np.arange(offset_arr.size)*N + offset_arr
    out = np.zeros(idx.max() + N,dtype=regular_sequence.dtype)
    np.put(out,regular_sequence)
    return out

In [64]: # Setup inputs
    ...: regular_sequence = np.array([1,dtype=np.int)
    ...: n_iter = 1000
    ...: lag_mean = 10 # mean length of zeros sequence
    ...: lag_sd = 1 # standard deviation of zeros sequence length
    ...: 
    ...: # Sequence of lags lengths
    ...: lag_seq = [int(round(normalvariate(lag_mean,lag_sd))) for x in range(n_iter)]
    ...: 

In [65]: out1 = original_app(lag_seq,regular_sequence)

In [66]: out2 = vectorized_app(lag_seq,regular_sequence)

In [67]: %timeit original_app(lag_seq,regular_sequence)
100 loops,best of 3: 4.28 ms per loop

In [68]: %timeit vectorized_app(lag_seq,regular_sequence)
1000 loops,best of 3: 294 µs per loop

总结

以上是编程之家为你收集整理的python – 使用随机长度的块生成1d numpy全部内容,希望文章能够帮你解决python – 使用随机长度的块生成1d numpy所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶