在 Python 中跨数组应用任意操作的更好方法是什么?



我有一个脚本,用于绘制时域数据,包括通过指定公式基于原始数据创建新数据通道的方法。

例如,我将原始数据整理在 [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 循环。

最新更新