Numpy数组而不是python列表-使用nditer从两个1d数组创建一个2d数组
下面的代码可以工作,但是尽管做了一些努力,仍然无法理解如何使用numpy数组(使用nditer)而不是python列表(使用enumerate) 这是一个心理学实验,每个实验呈现四种刺激中的一种,并记录参与者的反应时间。然后,通过从两个1d阵列创建2d阵列,计算四种试验类型的平均反应时间Numpy数组而不是python列表-使用nditer从两个1d数组创建一个2d数组,python,numpy,Python,Numpy,下面的代码可以工作,但是尽管做了一些努力,仍然无法理解如何使用numpy数组(使用nditer)而不是python列表(使用enumerate) 这是一个心理学实验,每个实验呈现四种刺激中的一种,并记录参与者的反应时间。然后,通过从两个1d阵列创建2d阵列,计算四种试验类型的平均反应时间 trialTypeData = [3, 0, 2, 1, 1, 0, 2, 3] Rt = [900, 1200, 1300, 1400, 1100, 1200, 1300, 1400] RtByTrialT
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)
不要使用
nditer
。有更好的方法:
meanTrialTypeRt = [Rt[trialTypeData == trialType].mean()
for trialType in xrange(4)]
对于每个试验类型,这将选择trialTypeData
等于trialType
的位置,从Rt
获取这些位置,并计算平均值。也许有更好的方法可以用我不熟悉或不记得的NumPy或SciPy统计例程来实现这一点;我使用的列表理解是一个巨大的危险信号,并且这个例程的运行时间仍然会随着试用类型的数量而不必要地增长
(注意,
Rt
和trialTypeData
需要是NumPy数组才能工作。)不要使用nditer
。有更好的方法:
meanTrialTypeRt = [Rt[trialTypeData == trialType].mean()
for trialType in xrange(4)]
对于每个试验类型,这将选择trialTypeData
等于trialType
的位置,从Rt
获取这些位置,并计算平均值。也许有更好的方法可以用我不熟悉或不记得的NumPy或SciPy统计例程来实现这一点;我使用的列表理解是一个巨大的危险信号,并且这个例程的运行时间仍然会随着试用类型的数量而不必要地增长
(注意,
Rt
和trialTypeData
需要是NumPy数组才能工作。)不要使用nditer
。有更好的方法:
meanTrialTypeRt = [Rt[trialTypeData == trialType].mean()
for trialType in xrange(4)]
对于每个试验类型,这将选择trialTypeData
等于trialType
的位置,从Rt
获取这些位置,并计算平均值。也许有更好的方法可以用我不熟悉或不记得的NumPy或SciPy统计例程来实现这一点;我使用的列表理解是一个巨大的危险信号,并且这个例程的运行时间仍然会随着试用类型的数量而不必要地增长
(注意,
Rt
和trialTypeData
需要是NumPy数组才能工作。)不要使用nditer
。有更好的方法:
meanTrialTypeRt = [Rt[trialTypeData == trialType].mean()
for trialType in xrange(4)]
对于每个试验类型,这将选择trialTypeData
等于trialType
的位置,从Rt
获取这些位置,并计算平均值。也许有更好的方法可以用我不熟悉或不记得的NumPy或SciPy统计例程来实现这一点;我使用的列表理解是一个巨大的危险信号,并且这个例程的运行时间仍然会随着试用类型的数量而不必要地增长
(注意,
Rt
和trialTypeData
需要是NumPy数组才能工作。)对于这种数据分析,我建议使用而不是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]
对于这种数据分析,我建议使用而不是
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]
对于这种数据分析,我建议使用而不是
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]
对于这种数据分析,我建议使用而不是
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]
还有一种方法:
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,该值应该是多少才能使整形生效。还有另一种方法:
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,该值应该是多少才能使整形生效。还有另一种方法:
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,该值应该是多少才能使整形生效。还有另一种方法:
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找出使整形工作的值。比我的答案更好!这看起来确实非常有效,但是我不得不使用Numpy数组,因为我使用的是刺激演示包(PsychoPy)。谢谢你把我介绍给熊猫,我会读一读的。比我的答案更好!这看起来确实非常有效,但是我不得不使用Numpy数组,因为我使用的是刺激演示包(PsychoPy)。谢谢你的介绍