我有一个用于绘制时域数据的脚本,包括一个通过指定公式基于原始数据创建新数据通道的方法。你知道吗
例如,我将原始数据整理在一个由float组成的[mxn]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)方式来实现这一点。有没有其他方法可以实现这一点,以改善上述?你知道吗
根据我对你的代码的阅读,你基本上是在逐步建立一个数学函数。我不使用重复的字符串替换,而是将general函数重写为Python函数,将数组引用作为参数。你知道吗
在Python中,函数是可以存储在变量中的一级对象。此外,还有functools.partial,它允许您获取一个函数变量并输出另一个附加了特定参数的函数,例如特定数组。文档中给出的示例是非常不言自明的,应该在您使用for循环时进行推广。你知道吗
相关问题 更多 >
编程相关推荐