Python使用numpy加速嵌套循环
嗨,我正在尝试制作一个python代码的尹算法 在第3步中,我必须使用三重for循环作为下面的代码Python使用numpy加速嵌套循环,python,algorithm,numpy,Python,Algorithm,Numpy,嗨,我正在尝试制作一个python代码的尹算法 在第3步中,我必须使用三重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_ind
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))
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
我用numpy从auto函数更改了second for循环
代码仍然很慢,我需要更改第三个for循环
我尝试使用numpy的from函数,如下代码所示
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))
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或lag的参数
如何加速此功能
我应该使用多处理吗?代码看起来可以很容易地重写为Cython,因此如果您不想使用纯Python解决方案,我建议您这样做。另外,您能提供一些示例数据吗?@SergeiLebedev sample是一个长度为20000的声音。代码看起来可以很容易地重写为Cython,因此,如果您不想要纯Python解决方案,我建议您这样做。另外,你能提供一些样本数据吗?@SergeiLebedev样本是一个长度为20000的声音