2017-01-07 2 views
1

다음과 같이 정의 된 함수가 있다고 가정하면 벡터화 코드에 많은 어려움을 겪었습니다. 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)) 

업데이트 :이 큰 그림을 이해 (시도)하는 것입니다 같은 문제를 해결하고, 2D 이상으로 모든 것을 처리하는 다른 방법으로 올

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

한 가지 방법 (LxK 어레이). 또 다른 하나는 multifrac_Brownian_motion을 검사하여 속도를 높이고 가능하면 스칼라 또는 1 차원 어레이에 의존하는 단계를 제거하는 것입니다. 즉, 내부에서 작업하십시오. 우리가 속도 향상을 충분히 얻을 수 있다면 루프에서 호출해야한다는 것은 중요하지 않을 수 있습니다. 더욱 개선 된 점은 높은 차원에서 운영하는 방법을 제시하는 것입니다. 밖으로 안쪽에서 시작으로

, 내가 가진 t_ks CALC를 교체하는 게 좋을 것 :

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

list_hurst 때문에, ind_hurst 모든 n에 대해 동일합니다, 당신이 get_hurst_value의 일부를 소비하는 시간을 이동할 수 있습니다 의심 루프 외부.

그러나 나는 그 구조를 개선하기 위해 대부분의 노력을 기울였습니다. condlist. 그것은 당신의 바깥 고리의 깊숙한 곳에서 묻힌 목록 이해력입니다.

piecewise도이 중 seg_points을 반복합니다.