繁体   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