我有一個數字串列(浮點數),我想估計平均值。我還需要估計這種均值的變化。我的目標是對串列重新采樣 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,但我在升級scipy到1.7.1inanaconda以匯入它時遇到問題。
uj5u.com熱心網友回復:
使用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 倍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325923.html
上一篇:改變陣列的維度
