我想做的基本上是标题上说的。我有一系列的脉冲,我产生了一个矩形的“触发”脉冲,当上升的边缘超过一个阈值时。虽然到目前为止,我只能创造出这些恒定振幅的触发脉冲。我有一个脉冲振幅阵列(脉冲高度)和一个触发指数阵列(triggersLED),它们各自都有1000个元素。我试图编写我的代码,这样触发脉冲的幅度将等于每个元素的脉冲高度值。我在下面添加了我的代码,但是在绘制触发脉冲时,它们的高度是恒定的,而不是输入脉冲的高度相同。
前5个脉冲高度值为0.0448、0.0416、0.0204、0.0328、0.068,前5个触发指数为9762、49775、89872、129843、169753。
我希望第一次触发脉冲发生在9762,高度0.0448。这意味着cLED将有0到9761指数,然后在下一个4000个指数中值为0.0448,然后返回到零。下一个触发点发生在49775,高度0.0416等等.这些触发脉冲的宽度并不重要(我在代码中将其设置为4000 )。
cLED = np.zeros(4000000)
for a in range(1000):
for b in triggersLED:
cLED[b:b+4000] = pulseheight[a]发布于 2020-11-27 16:21:00
这是可行的,但可能有更好的方法。迭代索引和幅值,并将其分配给切片。
import numpy as np
pulseheight = np.array([0.0448, 0.0416, 0.0204, 0.0328, 0.068])
trigger = np.array([9, 49, 89, 129, 169])
width = 4
cLED = np.zeros(200)
for i,a in zip(trigger,pulseheight):
cLED[i:i+width] = a变异:可能没有什么更好的。
cleds = np.split(cLED,trigger)
for i,a in enumerate(cleds[1:]):
a[:width] = pulseheight[i]
cleds = np.concatenate(cleds)尝试摆脱pythonfor循环。在触发器索引上拆分cLED;将得到的数组填充到相同的宽度,以便它们可以连接到2d数组;进行赋值;平坦并删除nan的数组。
pad_width = np.diff(trigger).max()
cleds = np.vstack((np.pad(a,(0,pad_width-len(a)),constant_values=np.nan) for a in cleds))
cleds[1:,:4] = pulseheight[:,None]
cleds = np.ravel(cleds)
cleds = cleds[~np.isnan(cleds)]另一个使用Pandas的变体,它最终具有稀疏的行,所以当数据被重新组合时,需要删除nan填充值。使用分配到片和广播。
import pandas as pd
# using arrays defined above
cleds = np.split(cLED,trigger)
df = pd.DataFrame(cleds)
df.iloc[1:,:4] = pulseheight[:,None]
q = np.concatenate(df.values)
q = q[~np.isnan(q)]我真的没有感觉到哪一个是最好的。
https://stackoverflow.com/questions/65039576
复制相似问题