首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化代码- Mathcad和Python之间的比较

优化代码- Mathcad和Python之间的比较
EN

Stack Overflow用户
提问于 2021-11-18 11:48:52
回答 1查看 31关注 0票数 0

SL_Only,pandas数据帧,包含来自13K位置(记录)的三个发射器的信号。SL_Only形状为13722x3所有数据类型均为numericTxID_L,pandas dataframe,shape is 3x10包含SL_Only中三个发射器的10个参数。

F_BW = 700,2100,step_size=200 CF = 20,120,step_size= 5 TxID = str,可以是任何值SC_SL = best of TxID

除了TxIDs之外,所有的值都是numeric

代码语言:javascript
复制
SC_SL = '<Best column_name from SL_Only>'
row_arr = []

for _, r in tqdm(SL_Only.iterrows()):
    max_rsrp = SL_Only[SC_SL][_]
    max_txid = (r == max_rsrp).T.idxmax()
    paramax_cf = TxID_L[TxID_L['TxID'] == max_txid]['CF'].values
    paramax_bw = TxID_L[TxID_L['TxID'] == max_txid]['F_BW'].values
    col_arr = []
    for c in SL_Only.columns.values:
        rsrp = r[c]
        txid = (r == rsrp).T.idxmax()
        param_cf = TxID_L[TxID_L['TxID'] == txid]['CF'].values
        param_bw = TxID_L[TxID_L['TxID'] == txid]['F_BW'].values
        calc = rsrp + 10*np.log10(abs((paramax_cf+0.5*paramax_bw - param_cf+0.5*param_bw)/paramax_bw))
        col_arr.append(calc[0])
    row_arr.append(col_arr)

row_arr需要1.5分钟来处理,而在Mathcad中只需要几分之一秒(我还没有用过它,但我的经理告诉我它是这样工作的。)

你能找出代码中的错误,这样处理起来就更省时了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-21 05:14:08

我已经写了一些生成假输入的代码,这至少允许我在没有修改的情况下运行您发布的代码:

代码语言:javascript
复制
import numpy as np
import pandas as pd

TxIDs = ['sensor1', 'sensor2', 'sensor3']
params = ['CF', 'F_BW']

nsensors = len(TxIDs)
nmeasurements = 13722

SL_Only = pd.DataFrame(np.random.uniform(size=(nmeasurements, nsensors)), columns=TxIDs)
TxID_L = pd.DataFrame(np.random.uniform(size=(nsensors, len(params))), columns=params)
TxID_L['TxID'] = TxIDs
SC_SL = 'sensor1'

在这些定义之后,运行您的代码(在我的机器上大约需要45秒)生成一个列表row_arr的列表。为了比较结果,我定义

代码语言:javascript
复制
old_result = pd.DataFrame(row_arr, columns=SL_Only.columns.values)

下面的代码复制了您的结果,大约需要0.2秒:

代码语言:javascript
复制
TxID_L.set_index('TxID', inplace=True)

paramax_cf = TxID_L.loc[SC_SL, 'CF']
paramax_bw = TxID_L.loc[SC_SL, 'F_BW']
param_bw = TxID_L.loc[:, 'F_BW']
param_cf = TxID_L.loc[:, 'CF']

new_result = SL_Only + 10*np.log10(abs((paramax_cf+0.5*paramax_bw - param_cf+0.5*param_bw)/paramax_bw))

为了确认这一点,我确实

代码语言:javascript
复制
(new_result - old_result).abs().values.max()

我每次运行这段代码都会返回0。

关键的见解是尽可能多地只做一次,而不是循环,并使用Pandas提供的矢量化操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70019327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档