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