Numpy:评估高于/低于平均值的标准偏差

时间:2014-02-28 15:29:55

标签: python optimization numpy standards deviation

我想计算低于和高于n_par参数和n_sample样本矩阵平均值的值的标准偏差。我到目前为止找到的最快的方法是:

stdleft = numpy.zeros_like(mean)
for jpar in xrange(mean.shape[1]):
    stdleft[jpar] = p[p[:,jpar] < \
                      mean[jpar],jpar].std()

其中p是像(n_samples,n_par)这样的矩阵。没有for循环,有更聪明的方法吗?我大概有n_par = 200和n_samples = 1e8,因此这三行需要很长时间才能完成。

任何想法都会非常有用!

谢谢

2 个答案:

答案 0 :(得分:2)

熊猫是你的朋友。在pandas Dataframe中转换矩阵并在逻辑上索引Dataframe。像这样的东西

mat = pandas.DataFrame(p)

这会从原始numpy矩阵p创建一个DataFrame。然后我们计算DataFrame的列均值。

m = mat.mean()

创建n_par的所有列均值mat大小的数组。最后,使用mat逻辑运算对<矩阵建立索引,并将std应用于此。

stdleft = mat[mat < m].std()

同样适用于stdright。花几分钟在我的机器上进行计算。

以下是pandas的文档页面:http://pandas.pydata.org/

修改:使用以下评论进行编辑。您可以使用原始p进行几乎相似的索引编制。

m = p.mean(axis=0)
logical = p < m

logical包含与p大小相同的布尔矩阵。这是大熊猫派上用场的地方。您可以使用相同大小的逻辑直接索引pandas矩阵。在numpy中这样做有点困难。我想循环是实现它的最好方法吗?

for i in range(len(p)):
    stdleft[i] = p[logical[:, i], i].std()

答案 1 :(得分:2)

据我了解,您希望计算每列的标准偏差,其中值低于该列的平均值。

在numpy中,最简单的方法就是使用蒙面数组。

举个例子:

import numpy as np

# 10 samples, 3 columns
p = np.random.random((10, 3))

# Calculate the mean of each column
colmeans = p.mean(axis=0)

# Make a boolean array where our condition is True
mask = p < colmeans

# Find the standard deviation of values in each column below the column's mean.
# For masked arrays, the True values will be masked, so we'll invert the array.
stdleft = np.ma.masked_where(~mask, p).std(axis=0)

您也可以使用pandas作为@SudeepJuvekar提及。性能应大致相似,但对于此特定操作(未经测试),大熊猫应该更快一点。