[英]Numpy arrays instead of python lists - using nditer to create a 2d array from two 1d arrays
以下代碼有效,但是盡管付出了一些努力,但仍無法弄清楚如何使用numpy數組(使用nditer)而不是python列表(使用枚舉)。
它是用於心理學實驗的,其中每個試驗都呈現四個刺激之一,並記錄參與者的反應時間。 然后,通過從兩個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)
對於這種數據分析,我建議使用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]
不要使用nditer
。 有更好的方法:
meanTrialTypeRt = [Rt[trialTypeData == trialType].mean()
for trialType in xrange(4)]
對於每種試驗類型,這將選擇trialTypeData
等於trialType
位置,並從Rt
獲取這些位置,然后計算平均值。 我不熟悉或現在不記得的NumPy或SciPy統計例程可能有更好的方法來執行此操作; 我使用的列表理解是一個很大的危險信號,並且該例程的運行時間仍然會隨着試用類型的數量而不必要地增長。
(請注意, Rt
和trialTypeData
必須是NumPy數組才能起作用。)
這是另一種方式:
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找出使整形起作用的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.