Python 数据帧上迭代函数的矢量化

Python 数据帧上迭代函数的矢量化,python,pandas,dataframe,loops,vectorization,Python,Pandas,Dataframe,Loops,Vectorization,我有一个数据帧,其中第一行是初始条件 df = pd.DataFrame({"Year": np.arange(4), "Pop": [0.4] + [np.nan]* 3}) 函数f(x,r)=r*x*(1-x),其中r=2是一个常数,0不可能以矢量化的方式实现这一点 根据定义,矢量化利用并行处理来减少执行时间。但你问题中的期望值必须按顺序计算,而不是并行计算。有关详细说明,请参阅。像这样的事情是行不通的 然而,获

我有一个数据帧,其中第一行是初始条件

df = pd.DataFrame({"Year": np.arange(4),
                   "Pop": [0.4] + [np.nan]* 3})

函数
f(x,r)=r*x*(1-x)
,其中
r=2
是一个常数,
0不可能以矢量化的方式实现这一点

根据定义,矢量化利用并行处理来减少执行时间。但你问题中的期望值必须按顺序计算,而不是并行计算。有关详细说明,请参阅。像这样的事情是行不通的

然而,获得更多的效率是可能的。您可以使用生成器进行迭代。这是实现迭代过程的一个非常常见的构造

def gen(x_init, n, R=2):
    x = x_init
    for _ in range(n):
        x = R * x * (1-x)
        yield x

# execute            
df.loc[1:, "Pop"] = list(gen(df.at[0, "Pop"], len(df) - 1))
结果:

print(df)
        Pop
0  0.400000
1  0.480000
2  0.499200
3  0.499999
对于小数据,完全可以停在这里。但是,如果函数要执行很多次,可以考虑用.< /p>优化生成器。
  • pip安装numba
    conda首先在控制台中安装numba
  • import numba
  • 在生成器前面添加decorator
    @numba.njit

np.nan
s的数量更改为10^6,然后自己检查执行时间的差异。在我的Core-i5 8250U 64位笔记本电脑上实现了从468ms到217ms的改进。

你能举一个例子,用数据解释所需的行为吗。函数是f(x)=r*x*(1-x),其中r是常数,x是百分比。第一列是起始条件,其中r=2,x=0.4,索引是时间间隔。d[0]将是(0,0.4)。d[1]为(1,0.48)。d[2]应该是(2,0.4992),但它是(2,0.48),与其余行相同。代码中没有定义任何变量。请提供输入数据和预期输出。是否可以在a中提供示例数据和预期输出?您将正确的示例编辑错了<代码>np.arange(51)
给出错误,因为列表的长度不匹配。请注意,示例的主要目的是让潜在的帮助者重现您的问题,因此只关注相关部分,并尽可能简化其他部分。我正在编辑你的文章。请等待它生效。
def gen(x_init, n, R=2):
    x = x_init
    for _ in range(n):
        x = R * x * (1-x)
        yield x

# execute            
df.loc[1:, "Pop"] = list(gen(df.at[0, "Pop"], len(df) - 1))
print(df)
        Pop
0  0.400000
1  0.480000
2  0.499200
3  0.499999