首页 > 解决方案 > 有什么方法可以加快循环(numpy 或 pandas)中的依赖迭代,如矢量化?

问题描述

我有一个以 pandas 数据框或 numpy 数组作为输入的模型。该模型在循环中迭代行,当前行计算取决于上一步。有什么方法可以在其中加入 numpy vectorize 吗?或任何其他使代码运行得更快的方法。我有很大的投入,速度的任何改进都可以节省大量时间。下面是一个示例代码供参考。NUMpy 输入提高了 pandas 数据帧输入的速度。任何建议都受到高度赞赏。

    import pandas as pd
    import numpy as np
    inp1 = pd.DataFrame(np.random.rand(5,5))
    inp2 = pd.DataFrame(np.random.rand(5,5))

    outp1 = pd.DataFrame(np.zeros(inp1.shape, dtype = float),
                 index = inp1.index, columns = inp1.columns)

    def sample_code_pandas(params):
        aa, bb, lmt = params
        outp1[inp2 < lmt] = inp1[inp2 < lmt]
        out_pr = outp1.iloc[0,:]    

        for i in range(1, len(outp1)):
            rates = ((inp1.iloc[i,:] - aa) / (aa - bb))
            outp1.iloc[i,:] = inp1.iloc[i,:] * rates - out_pr
            out_pr = outp1.iloc[i,:]
        return outp1
    %timeit sample_code_pandas((-0.2, -0.5, 0 ))

    #******************************************************

    inp1 = np.random.rand(5,5)
    inp2 = np.random.rand(5,5)
    outp1 = np.zeros(inp1.shape, dtype = float)
    
    def sample_code_numpy(params):
        aa, bb, lmt = params
        outp1[inp2 < lmt] = inp1[inp2 < lmt]
        out_pr = outp1[0]
    
        for i in range(1, len(outp1)):
            rates = ((inp1[i] - aa) / (aa - bb))
            outp1[i] = inp1[i] * rates - out_pr
            out_pr = outp1[i]
        return outp1
    %timeit sample_code_numpy((-0.2, -0.5, 0 ))

标签: pythonperformancenumpyiterationvectorization

解决方案


推荐阅读