繁体   English   中英

引导数字列表均值的最有效方法是什么?

[英]What is the most efficient way to bootstrap the mean of a list of numbers?

我有一个数字列表(浮点数),我想估计平均值。 我还需要估计这种平均值的变化。 我的目标是对列表重新采样 100 次,我的输出将是一个长度为 100 的数组,每个元素对应于重新采样列表的平均值。

这是我想要实现的一个简单可行的示例:

import numpy as np
data = np.linspace(0, 4, 5)
ndata, boot = len(data), 100
output = np.mean(np.array([data[k] for k in np.random.uniform(high=ndata, size=boot*ndata).astype(int)]).reshape((boot, ndata)), axis=1)

然而,当我必须为具有大量元素的许多列表重复时,这很慢。 该方法也似乎非常笨拙且非 Pythonic。 实现我的目标的更好方法是什么?

PS 我知道scipy.stats.bootstrap ,但是我在anaconda scipy升级到1.7.1以导入它时scipy问题。

使用np.random.choice

import numpy as np

data = np.linspace(0, 4, 5)
ndata, boot = len(data), 100
output = np.mean(
    np.random.choice(data, size=(100, ndata)),
    axis=1)

如果我理解正确,这个表达式(在你问题的代码中):

np.array([data[k] for k in np.random.uniform(high=ndata, size=boot*ndata).astype(int)]).reshape((boot, ndata)

正在做替换抽样,这正是 np.random.choice 所做的。

以下是一些时间供参考:

%timeit np.mean(np.array([data[k] for k in np.random.uniform(high=ndata, size=boot*ndata).astype(int)]).reshape((boot, ndata)), axis=1)
133 µs ± 3.96 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.mean(np.random.choice(data, size=(boot, ndata)),axis=1)
41.1 µs ± 538 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

可以看出np.random.choice产生了 3 倍的改进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM