다음과 같이 정의 된 함수가 있다고 가정하면 벡터화 코드에 많은 어려움을 겪었습니다. 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)
'get_hurst_value' 구현을 공유 할 수 있습니까? – Divakar
@Divakar 코드가 업데이트되었습니다. – Xingdong
다른 레벨의 벡터화가 필요/가능합니다. 단계적으로 벡터화하는 것이 좋습니다. 그래서,'get_hurst_value'를 벡터화하는 것으로 시작하십시오. 나는 그것에 샘플 입력과 그것으로부터 산출물을 가지고 새로운 질문을 게시 할 것을 조언 할 것이다. – Divakar