簡體   English   中英

numpy數組而不是python列表-使用nditer從兩個1d數組創建2d數組

[英]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統計例程可能有更好的方法來執行此操作; 我使用的列表理解是一個很大的危險信號,並且該例程的運行時間仍然會隨着試用類型的數量而不必要地增長。

(請注意, RttrialTypeData必須是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM