2

我想计算低于和高于 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 ,因此这三行需要很长时间才能执行。

任何想法都会非常有帮助!

谢谢

4

2 回答 2

2

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

mat = pandas.DataFrame(p)

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

m = mat.mean()

创建n_par的所有列均值的大小数组matmat最后,使用<逻辑运算索引矩阵并应用于该矩阵std

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

同样对于stdright。花几分钟在我的机器上计算。

这是熊猫的文档页面: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()
于 2014-02-28T15:54:16.720 回答
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 提到的那样使用它。性能应该大致相似,但对于这个特定操作(未经测试),pandas 应该更快一些。

于 2014-02-28T18:28:38.897 回答