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

2024-06-16 11:00:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,我将原始数据整理在一个由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)方式来实现这一点。有没有其他方法可以实现这一点,以改善上述?你知道吗


Tags: 数据方法infordata原始数据channel绘制
1条回答
网友
1楼 · 发布于 2024-06-16 11:00:53

根据我对你的代码的阅读,你基本上是在逐步建立一个数学函数。我不使用重复的字符串替换,而是将general函数重写为Python函数,将数组引用作为参数。你知道吗

在Python中,函数是可以存储在变量中的一级对象。此外,还有functools.partial,它允许您获取一个函数变量并输出另一个附加了特定参数的函数,例如特定数组。文档中给出的示例是非常不言自明的,应该在您使用for循环时进行推广。你知道吗

相关问题 更多 >