Python用numpy加速嵌套循环

时间:2016-04-21 14:58:59

标签: python algorithm numpy

您好我正在尝试制作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或滞后的参数。

我怎样才能加快这个功能?

我应该使用多处理吗?

0 个答案:

没有答案