[英]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.