在Python中,使用pandas和numpy从递归关系生成序列最有效的方法是什么?

2024-03-29 11:53:07 发布

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

使用pandas和numpy,f1函数最有效的方法是什么?你知道吗

import numpy as np
import pandas as pd
from time import time

n = 10000
df = pd.DataFrame()
df["a"] = np.random.randn(n)
df["b"] = np.random.uniform(n)


def f1(df):
    df.loc[0, "c"] = 100
    for i in range(1, len(df)):
        df.loc[i, "c"] = df.loc[i, "a"] * df.loc[i, "b"] +\
            (1 - df.loc[i, "a"]) * df.loc[i - 1, "c"]

start_time = time()
f1(df)
ellapsed_time = time() - start_time
print(ellapsed_time)

Tags: 方法函数importnumpypandasdftimeas
1条回答
网友
1楼 · 发布于 2024-03-29 11:53:07

有时scipy.signal可以解决这种重复,但我在这里没有找到一个好的解决方案。Nuba解决方案:

import numba
@numba.njit
def f1n(a,b):
    c=np.empty_like(a)
    c[0]=100
    for i in range(1,len(a)):
        c[i]=a[i]*b[i]+(1-a[i])*c[i-1]
    return c

测试:

In [559]: %timeit f1n(df.a.values,df.b.values)
52.9 µs ± 1.24 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [560]: %timeit f1(df)
4.62 s ± 13 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [563]: np.allclose(df.c,f1n(df.a.values,df.b.values))
Out[563]: True

90000 x更快,同样可读。你知道吗

相关问题 更多 >