我想计算低于和高于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,因此这三行需要很长时间才能完成。
任何想法都会非常有用!
谢谢
答案 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提及。性能应大致相似,但对于此特定操作(未经测试),大熊猫应该更快一点。