我有一个脚本,用于绘制时域数据,包括通过指定公式基于原始数据创建新数据通道的方法。
例如,我将原始数据整理在 [m x n] 浮点数的 numpy 数组中,如下所示
x0 y00 y10 ... yn0
x1 y01 y11 ... yn1
: : : : :
xm y0m y1m ... ynm
第一列是时间数据,后续列代表各种序列。绘制的序列由匹配的字符串标头确定,例如:
headers = ["Time","Power","Frequency","Current","Voltage",...,"Series N"]
然后,我按以下格式将公式指定为字符串:
formula_str = "{Power}*{Frequency} + 3*{Current} + (3 if {Voltage}>0 else 0)"
请注意,我使用 {} 作为系列名称的任意标识符。
为了将此公式转换为新的数据通道,我当前的解决方案是遍历时域并使用eval
手动生成数据点。
# convert formula string to array references
for n,chan in enumerate(data_channels):
# process reference to data channel
formula_str = formula_str.replace("{%s}" % chan, "data[%d][x]" % n)
# generate channel data
formula_channel_data = []
for n in range(len(time_data)):
formula_str_n = formula_str
for m in range(len(data_channels)):
formula_str_n = formula_str_n.replace("data[%d][x]" % m,str(data[m][n]))
formula_channel_data += [eval(formula_str_n)]
formula_channel_data = np.array(chan_data)
最终结果是我现在有一个额外的数据通道z
生成的数据。
x0 y00 y10 ... yn0 zn0
x1 y01 y11 ... yn1 zn1
: : : : : :
xm y0m y1m ... ynm znm
正如您所料,这很慢,我相信一定有一种更好(更快、更 pythonic(的方式来实现这一点。有没有另一种方法可以实施,可以改善上述情况?
根据我对你的代码的阅读,你基本上是在尝试逐步构建一个数学函数。与其使用重复的字符串替换,我会将通用函数重写为 Python 函数,该函数将数组引用作为参数。
在Python中,函数是可以存储在变量中的一类对象。此外,还有functools.partial 它允许你获取一个函数变量并吐出另一个附加了特定参数的函数,例如特定的数组。文档中给出的示例非常不言自明,应该在使用时推广到 for 循环。