如何根据频率展平 numpy 数组以获得正确的标准偏差?

How to flatten a numpy array based on frequency to get the correct standard deviation?

我可以很容易地得到 numpy 中一维列表中某些数字的标准差,如下所示:

import numpy as np
arr1 = np.array([100, 100, 100, 200, 200, 500])
sd = np.std(arr1)
print(sd)

但我的数据是二维列表的形式,其中每个内部列表的第二个值是频率:

arr2 = np.array([[100, 3], [200, 2], [500, 1]])

如何根据频率将其展平(将 arr2 更改为 arr1),以获得正确的标准偏差?

使用arr2[:, 0].repeat(arr2[:, 1]).

如果想把整个数组展平,可以使用ravel()

arr2.ravel()
# output: array([100,   3, 200,   2, 500,   1])

如果你想要一个特定的列,你可以select所有行并使用列的索引

arr2[:,1]
# output: array([3, 2, 1])
arr2[:,0]
# output: array([100, 200, 500])

要得到标准差,可以在末尾加上.std()

sd = arr2.ravel().std()
# or
sd = arr2[:,0].std()
# or 
sd = arr2[:,1].std()
# etc

虽然@timgeb 的(好的)答案是最直接的,但如果您有非常大的输入,例如 np.array([[100, 3000], [200, 20000], [500, 100]])

,这可能效率不高

在这种情况下,您可以手动计算标准偏差

v,r = arr2.T
n = r.sum()
avg = (v*r).sum()/n
std = np.sqrt((r*(v-avg)**2).sum()/n)

输出:141.4213562373095

或使用statsmodels:

from statsmodels.stats.weightstats import DescrStatsW

v,r = arr2.T
DescrStatsW(v, weights=r, ddof=0).std
# 141.4213562373095