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

2024-05-19 15:40:30 发布

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

我有一个数字列表(浮动),我想估计平均值。我还需要估计这种平均值的变化。我的目标是对列表进行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)

然而,当我必须重复许多包含大量元素的列表时,这是相当缓慢的。这种方法看起来也很笨重,不符合肾盂。有什么更好的方法来实现我的目标

另外,我知道scipy.stats.bootstrap,但我在anaconda中将scipy升级到1.7.1时遇到问题,无法导入此内容


Tags: 方法importnumpy元素目标列表datanp
1条回答
网友
1楼 · 发布于 2024-05-19 15:40:30

使用^{}

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倍的改善

相关问题 更多 >