【发布时间】:2021-01-23 00:40:39
【问题描述】:
有没有办法加速依赖特定种子的每行 scipy rvs 方法调用?
import pandas as pd
import numpy as np
from scipy.stats import norm
df = pd.DataFrame({"loc": range(1000), "seed": range(1000)})
def apply_rvs(x):
np.random.seed(x["seed"])
return norm.rvs(x["loc"], 1)
%timeit df.apply( lambda x: apply_rvs(x), axis=1)
# 109 ms ± 3.53 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
numba 似乎不能很好地处理 scipy 对象
import numba
@numba.jit
def numba_apply_rvs(x):
np.random.seed(x["seed"])
return norm.rvs(x["loc"], 1)
df.apply( lambda x: numba_apply_rvs(x), axis=1)
编译回退到启用循环提升的对象模式,因为函数“apply_rvs”由于以下原因导致类型推断失败:无类型全局名称“规范”:无法确定
的 Numba 类型p>
除了并行化之外,我还可以采取其他方法来加快此操作的速度吗?
如果我可以拨打一个电话来生成所有这些类似于
的值,那就太好了In [33]: norm.rvs([1,2,3,4],[.1,.1,.1,.1])
Out[33]: array([0.93510993, 2.15662676, 2.79086298, 4.14563281])
但不幸的是,random_state 不能作为数组传递。
【问题讨论】:
-
您是否有理由希望从不同的种子中生成随机数?
-
它用于需要为每一行一致地生成相同数据的测试过程中,因此需要种子。我不希望每一行都有相同的数据,所以我也不能使用固定种子
-
在开始时修复种子仍将返回来自
rvs()的准随机抽签序列。每次平局都设置种子是非常不寻常的 -
基本思路是代码运行一次生成
person_id_1 time_1 value_1,稍后再运行生成person_id_1 time_1 value_1, person_id_1 time_2 value_2我希望value_1在每种情况下都相同,所以我使用@ 987654330@作为种子。