首先:随时编辑问题标题以使其更清楚。
我正在编写一个函数,该函数可以将标量和类似数组的对象用于多个输入。不管输入的类型如何,其行为都应该相同:我最终想遍历输入。如果它是一个标量,则每次迭代都应返回相同的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): ...
我只是想知道是否有内置(或至少比检查每个变量简单)的方法。
我将在这里粘贴我当前使用的男女同校的简化版本。它会产生许多具有不同频率的正弦波,可用于检查某些电路的频率响应。用户应该能够自己输入频率或起始频率,最终频率和步长。在此示例中,每个正弦波的振幅和持续时间应为常数,由amplitude
和duration
值(如果为方波)给出,如果它们是可迭代的,则每个频率都不同。
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