Python:使用zip类功能同时迭代和声明saclar

时间:2018-09-07 17:23:41

标签: python python-3.x iterable

首先:随时编辑问题标题以使其更清楚。

我正在编写一个函数,该函数可以将标量和类似数组的对象用于多个输入。不管输入的类型如何,其行为都应该相同:我最终想遍历输入。如果它是一个标量,则每次迭代都应返回相同的sacalar。一个模拟代码将是(使用ziplike函数):

a_string = 'Some characters'
a_number = 2
for s,n in ziplike(a_string,a_number):
   print(s,n)

这将返回

S 2
o 2
m 2 
...

但是,例如,如果a_number是列表,我希望它的行为就像zip。我不一定要编写此ziplike函数,因为我可以事先测试输入内容:

import numpy as np
if np.isscalar(a_number): 
   a_number = [a_number] * len(a_string)
for s,n in zip(a_numbber,a_string): ...

我只是想知道是否有内置(或至少比检查每个变量简单)的方法。

我将在这里粘贴我当前使用的男女同校的简化版本。它会产生许多具有不同频率的正弦波,可用于检查某些电路的频率响应。用户应该能够自己输入频率或起始频率,最终频率和步长。在此示例中,每个正弦波的振幅和持续时间应为常数,由amplitudeduration值(如果为方波)给出,如果它们是可迭代的,则每个频率都不同。

import numpy as np
def swipe(freqs=np.arrange(100,100,10), amplitude=1, duration=1):
    ''' 
    Yields a numer of sine waves wit desired frequency, amplitude and duration.

        freqs: tuple or array-like
            If tuple, it should be (start,stop,step) containing frequencies in
            Hz. If array-like, it should contain frequencies to sweep.
        ampliutde: float or array-like
            Aplitude of the generated signal. If array like, len(amplitude)
            sholud be equal to amount of frequencies to sweep. 
        duration: float or array-like
            Duration of each frequency. If array like, len(amplitude) sholud be
            equal to amount of frequencies to sweep.
    '''

    if isinstance(freqs,tuple):
        freqs = np.arange(freqs[0],freqs[1],freqs[2])

    N_freq = len(freqs)

    if np.isscalar(amplitude):
        amplitude = [amplitude] * N_freq

    if np.isscalar(duration):
        duration = [duration] * N_freq

    for freq, amp, dur in zip(freqs,amplitude,duration):
        time = np.arrange(0,dur,.01)
        wave = amp * np.sin(2 * np.pi * freq * time)
        yield wave

0 个答案:

没有答案