2013-12-20 43 views
0

以下代碼有效,但儘管一些努力無法弄清楚如何使用numpy數組(使用nditer)而不是python列表(使用枚舉)。Numpy數組而不是python列表 - 使用nditer從兩個1d數組創建一個2d數組

這是一個心理學實驗,每個試驗呈現四種刺激之一,並且記錄參與者的反應時間。然後通過從兩個1d陣列創建2d陣列,爲四種試驗類型的每一種計算平均反應時間。

trialTypeData = [3, 0, 2, 1, 1, 0, 2, 3] 
Rt = [900, 1200, 1300, 1400, 1100, 1200, 1300, 1400] 

RtByTrialType = [0, 0, 0, 0] 
meanRtByTrialType = [0, 0, 0, 0] 

for trialType in range(0, 4): 
    RtByTrialType[trialType] = [Rt[i] for i, x in enumerate(trialTypeData) if x == trialType] 
meanRtByTrialType[trialType] = sum(RtByTrialType[trialType])/len(RtByTrialType[trialType]) 

print "Average latencies by Trialtype:" 
print (meanTrialTypeRt) 

回答

1

請勿使用nditer。有更好的辦法:

meanTrialTypeRt = [Rt[trialTypeData == trialType].mean() 
        for trialType in xrange(4)] 

對於每個試驗類型,此選擇是trialTypeData等於trialType的位置,從Rt得到這些位置,並計算平均值。使用NumPy或SciPy統計程序可能會有更好的方法來處理這種情況,我不熟悉或不記得此刻;我使用的列表理解是一個大紅旗,並且此例程的運行時間仍隨着試用類型的數量不必要地增長。

(注意:RttrialTypeData將需要與NumPy陣列這個工作)

+0

我想你可以使用'bincount' /'digitize' /'直方圖'三重奏的成員來避免listcomp,但恕我直言,它比它的價值更麻煩。 – DSM

+0

優秀 - 這正是我所尋找的;無論是在解決方案和學習方面。謝謝。 –

2

對於這種數據的分析,我推薦使用pandas代替numpy;它使許多事情變得更容易。在這種情況下,你可以使用groupby做(收集按類型的項目),然後mean

>>> import pandas as pd 
>>> trialTypeData = [3, 0, 2, 1, 1, 0, 2, 3] 
>>> Rt = [900, 1200, 1300, 1400, 1100, 1200, 1300, 1400] 
>>> df = pd.DataFrame({"Rt": Rt, "type": trialTypeData}) 
>>> df 
    Rt type 
0 900  3 
1 1200  0 
2 1300  2 
3 1400  1 
4 1100  1 
5 1200  0 
6 1300  2 
7 1400  3 

[8 rows x 2 columns] 
>>> df.groupby("type").mean() 
     Rt 
type  
0  1200 
1  1250 
2  1300 
3  1150 

[4 rows x 1 columns] 
+0

比我的回答更好! – user2357112

+0

這確實看起來非常有效,但是由於我使用的刺激呈現包(PsychoPy),我不得不使用Numpy數組。謝謝你給我介紹熊貓,但我會讀一讀.. –

0

這裏的另一種方式:

trialTypeData = np.array([3, 0, 2, 1, 1, 0, 2, 3]) 
Rt = np.array([900, 1200, 1300, 1400, 1100, 1200, 1300, 1400]) 

meanTrialTypeRt = np.bincount(trialTypeData, Rt)/np.bincount(trialTypeData) 

或者,如果你知道有相同數量的對於每個試驗類型實例:

n_trials = 4 
order = trialTypeData.argsort() 
RtByTrialType = Rt[order].reshape((n_trials, -1)) 
meanTrialTypeRt = RtByTrialType.mean(1) 

第二種方法可能會更慢(或不我還沒有超時),但它產生的RtByTrialType陣列可以使用如果你以後需要它。重塑中的-1告訴numpy要弄清楚重塑工作的價值。

相關問題