我试图手动实现一个简单的小波变换示例。
def stepwavelet(t,start=-1,end=1):
return 1 if t>start and t<=(start+end)/2 else -1 if t<end and t>start else 0
def waveletgenerator(start,end,maxd=5):
i=1;diff=end-start
while i<maxd:
for j in range(i):
yield lambda x:stepwavelet(x,start+j*diff/i,start+(j+1)*diff/i)
i+=1
我有waveletgenerator创建我的基础功能。 lambdas还有一些东西,因为我不知道有一个更好的方法来返回一个部分提供参数的函数(在Mathematica中你可以声明像func1 [start,end] [x]和func1这样的函数[-2,2]是单参数函数。)
我试图在一个jupyter笔记本中创建基本元素的ipywidgets.interact pyplot,这似乎要求我有一个基函数列表而不是生成器。
问题:
print([wavl(20) for wavl in waveletgenerator(0,32)])
print([wavl(20) for wavl in list(waveletgenerator(0,32))])
print([wavl for wavl in waveletgenerator(0,32)][4](20))
返回
[-1, 0, 1, 0, -1, 0, 0, 0, 1, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
1
第一个输出是正确的,第二个和第三个输出不是。这里发生了什么,我怎样才能得到我想要的清单?
注意:我有一个解决方法
print(next(itertools.islice(waveletgenerator(0,32),4))(20))
-1
返回正确的答案,但是效率非常低,并且看起来像是一种糟糕的方式,我想知道这里发生了什么。此外,此解决方法不适用于交互:
@interact(which=(1,10))
def plot_wavelets(which=6):
plt.figure()
plt.xlim(-1,33)
plt.plot(np.arange(0,32,0.1),[next(itertools.islice(waveletgenerator(0,32),which))(x) for x in np.arange(0,32,0.1)])
plt.show()
仅显示第一个小波。