如何根据频率展平 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
我可以很容易地得到 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