您好我正在尝试制作YIN算法的python代码。
在第3步,我必须使用triple for循环作为下面的代码。
def auto(t, lag, samples):
total_index = len(samples)
zero_padded = np.append(samples, np.zeros(total_index))
# 2nd for loop changed to numpy
return np.sum(zero_padded[t+1: t+total_index+1] * zero_padded[t+1+lag: t+total_index+1+lag])
def diff_function(lag, rt0, samples):
return rt0 + auto(lag, 0, samples) - (2*auto(0, lag, samples))
# cumulative mean nomalized difference function
def CMN_diff_function(lag, rt0, samples):
nomalization = 0
for j in range(1, lag + 1): # 3rd for loop that I want to change
nomalization += diff_function(rt0, j, samples)
nomalization = nomalization / lag
return diff_function(rt0, lag, samples) / nomalization
rt0 = auto(0, 0, samples)
cmn_diff = [1]
for lag in range(1, 2700): # 1st for loop
print lag
cmn_diff.append(CMN_diff_function(lag, rt0, samples))
我用自动功能numpy改变了第二个for循环。
代码仍然很慢,我需要更改第三个for循环。
我尝试使用numpy函数作为下面的代码。
def CMN_diff_function(lag, rt0, samples):
nomalization = np.fromfunction(functools.partial(diff_function, rt0=rt0, samples=samples), (lag+1,), dtype=int)
nomalization = np.sum(nomalization)/lag
return diff_function(lag, rt0, samples)/nomalization
但我收到了错误
return np.sum(zero_padded[t+1: t+total_index+1] * zero_padded[t+1+lag: t+total_index+1+lag])
TypeError: only integer arrays with one element can be converted to an index
因为自动函数获取列表类型作为t或滞后的参数。
我怎样才能加快这个功能?
我应该使用多处理吗?