在列表中包装迭代器的行为不符合预期

时间:2018-06-12 17:58:27

标签: python generator wavelet wavelet-transform

我试图手动实现一个简单的小波变换示例。

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()

仅显示第一个小波。

0 个答案:

没有答案