2014-02-28 107 views
2

我想計算n_par參數和n_sample樣本矩陣平均值以下和以上值的標準偏差。我迄今發現的最快方法是:Numpy:評估高於/低於平均值的標準偏差

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

你可以添加導入和一些代碼來生成'p'? – YXD

回答

2

熊貓是你的朋友。在pandas Dataframe中轉換您的矩陣並在邏輯上爲Dataframe編制索引。像這樣的東西

mat = pandas.DataFrame(p) 

這將從原始numpy矩陣p創建一個DataFrame。然後我們計算DataFrame的列平均值。

m = mat.mean() 

創建n_parmat所有柱裝置尺寸的陣列。最後,使用<邏輯運算索引mat矩陣,並將std應用於此。

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

同樣對於stdright。花幾分鐘時間在我的機器上進行計算。

這裏的文檔頁面大熊貓:http://pandas.pydata.org/

編輯:編輯使用下面的評論。你可以使用原來的p做幾乎相似的索引。

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

logical含有相同大小的布爾矩陣p。這就是熊貓派上用場的地方。您可以使用相同大小的邏輯直接索引熊貓矩陣。在numpy中這樣做有點困難。我猜循環是實現它的最好方法?

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

對此,熊貓不需要。這相當於做'm = p.mean(axis = 0); (p

+0

'm = p.mean()'會產生一個_single number_。 'm = p.mean(axis = 0)'會給你每個column_的_means。 (類似於熊貓)您可以直接使用相同大小的邏輯數組索引numpy數組。你不需要循環。但是,在這種情況下,對於純粹的解決方案,您可以使用蒙版數組。 –

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提及。性能應該大體相似,但對於這種特定的操作(未經測試),熊貓應該快一點。

相關問題