2017-01-07 8 views
1

次のように定義された関数があるとします。iterate over n from 1 to Lを使用したいと考えています。このコードはforループこの関数を呼び出すためには外部。ベクトル値を生成する関数のベクトル化コード

詳細:L, Kは、大きな整数です。 1000およびH_nは浮動小数点値です。

def multifrac_Brownian_motion(n, L, K, list_hurst, ind_hurst): 

    t_ks = np.asarray(sorted(-np.array(range(1, K + 1))*(1./L))) 

    t_ns = np.linspace(0, 1, num=L+1) 
    t_n = t_ns[n] 

    chi_k = np.random.randn(K) 
    chi_lminus1 = np.random.randn(L) 

    H_n = get_hurst_value(t_n, list_hurst, ind_hurst) 

    part1 = 1./(np.random.gamma(0.5 + H_n)) 

    sums1 = np.dot((t_n - t_ks)**(H_n - 0.5) - ((-t_ks)**(H_n - 0.5)), chi_k) 
    sums2 = np.dot((t_n - t_ns[:n])**(H_n - 0.5), chi_lminus1[:n]) 

    return part1*(1./np.sqrt(L))*(sums1 + sums2) 

for n in range(1, L + 1): 
     onelist.append(multifrac_Brownian_motion(n, L, K, list_hurst, ind_hurst=ind_hurst)) 

アップデート:このような問題に取り組むための

def list_hurst_funcs(M, seg_size=10): 
    """Generate a list of Hurst function components 

    Args: 
     M: Int, number of hurst functions 
     seg_size: Int, number of segmentations of interval [0, 1] 
    Returns: 
     list_hurst: List, list of hurst function components 
    """ 

    list_hurst = [] 

    for i in range(M): 
     seg_points = sorted(np.random.uniform(size=seg_size)) 
     funclist = np.random.uniform(size=seg_size + 1) 
     list_hurst.append((seg_points, funclist)) 

    return list_hurst 


def get_hurst_value(x, list_hurst, ind): 
    if np.isscalar(x): 
     x = np.array(float(x), ndmin=1) 

    seg_points, funclist = list_hurst[ind] 

    condlist = [x < seg_points[0]] +\ 
       [(x >= seg_points[s] and x < seg_points[s + 1]) 
              for s in range(len(seg_points) - 1)] +\ 
       [x >= seg_points[-1]] 

    return np.piecewise(x, condlist=condlist, funclist=funclist) 
+0

'get_hurst_value'の実装を共有できますか? – Divakar

+0

@Divakarコードが更新されました。 – Xingdong

+0

必要な/可能なベクトル化のレベルが異なります。私は段階的にそれをベクトル化することをお勧めします。ですから、 'get_hurst_value'をベクトル化することから始めましょう。私はサンプル入力とそれからの出力で新しい質問を投稿することをお勧めします。 – Divakar

答えて

0

一つの方法は、(TRY)にある全体像を理解し、2D以上のようにすべてを扱う別のアプローチが付属しています(LxKアレイ)。もう1つは、multifrac_Brownian_motionを調べて速度を上げようとし、可能であればスカラーまたは1次元配列に依存するステップを排除することです。言い換えれば、内側から作業します。十分な速度向上が得られれば、それをループで呼び出さなければならないということは重要ではないかもしれません。さらに改善すれば、高次元での操作方法が示唆されます。

裏返しからのスタートとして、私はt_ks CALCを交換することをお勧めしたい:list_hurstので

t_ks = -np.arange(K,0,-1)/L # 1./L if required by Py2 integer division 

ind_hurstはすべてnのために同じですが、私はあなたがget_hurst_valueの部分を消費するいくつかの時間を移動することができます疑いますループの外側にあります。

しかし、私はその改善のために多くの努力をしていたでしょうcondlist建設。それはあなたの外側のループの深いところに埋め込まれたリストの理解です。

piecewiseまた、これらのループはseg_pointsです。

関連する問題