0

我正在使用一个名为psychopy的程序,它是用python编写的,大多数时候它有一个足够的GUI,但是你可以输入你自己的代码部分。基本上我遇到的问题是我有一个 csv 文件,我让 python 导入,在 csv 文件中有六列,使用一些代码我可以让 python 随机化每列中的顺序:

import random 
import csv 

stimulilist=list(csv.reader(open('original_file.csv',"rU")))

stimuliones=[]
locationones=[]
locationtwos=[]
stimulitwos=[]
locationthrees[]
locationfours[]

for i in range(len(stimulilist)):
    stimuliones.append(stimulilist[i][0])
    locationones.append(stimulilist[i][1])
    locationtwos.append(stimulilist[i][2])
    stimulitwos.append(stimulilist[i][3])
    locationthrees.append(stimulilist[i][4])
    locationfours.append(stimulilist[i][5])

Stim1=stimuliones[1:]
location1=locationones[1:]
location2=locationtwos[1:]
Stim2=stimuliones[1:]
location3=locationthrees[1:]
location4=positionfours[1:]

然后我将它们随机化,这将为第一个试验块创建两个随机单词列表。

Stimuli1Random=random.sample(Stim1,len(Stim1)) 
Location1Random=random.sample(location1,len(location1))
Location2Random=random.sample(location2,len(location2))
Stimuli2Random=random.sample(Stim2,len(Stim2))
Location3random=random.sample(location3,len(location3))
Location4random=random.sample(location4,len(location4))

但是,我希望将刺激 1、位置 1 和位置 2 随机化在一起,并将刺激 2 位置 3 和位置 4 随机化在一起,例如:

它在 CSV 文件中的情况:

(row)    Stim1 Location1 Location2         (row)     Stim2 Location3 Location4
1        P1    Left      Left               1        c1    Left      Left
2        p2    Middle    Middle             2        c2    Middle    Middle
3        p3    Right     Right              3        c3    Right     Right
4        p4    Left      Left               4        c4    Left      Left
5        p5    Middle    Middle             5        c5    Middle    Middle
6        p6    Right     Right              6        c6    Right     Right

使用上面的代码,每一列都会被单独随机化,例如:

(row)    Stim1 Location1 Location2         (row)   Stim2  Location3 Location4
1        P6    Left      Middle             1      c5     Right     Left
2        p1    Right     Middle             2      c3     Middle    Middle
3        p5    Middle    Right              3      c1     Left      Middle
4        p4    Left      Left               4      c2     Right     Left
5        p3    Middle    Left               5      c4     Middle    Right
6        p2    Right     Right              6      c6     Left      Right

但我希望将行随机化,使其看起来像这样:

(row)    Stim1 Location1 Location2       (row)  Stim2  Location3 Location4
1        p2    Middle    Middle           1     c3      Right   Right
2        p6    Right     Right            2     c5      Middle  Middle
3        p3    Right     Right            3     c4      Left    Left
4        p4    Left      Left             4     c1      Left    Left
5        p5    Middle    Middle           5     c2      Middle  Middle
6        P1    Left      Left             6     c6      Right   Right

所以基本上我希望 Stim1、Location 1 和 Location 2 的行保持不变,但就像它们是同一列一样随机化,但是,我不想将它们合并到一列,重要的是它们保持单独的列。我也想要 stim2 位置 3 和位置 4。

另外,假设我想从 csv 文件中导入另一列,但不随机化,我将如何将其放入代码中?

4

1 回答 1

0

如果您想将这些数据部分随机化在一起,最简单的方法是将它们存储在一起。您甚至不必为此更改 csv 文件的结构。如果您将单个部分一起存储在一个列表中(而不是每列单独存储),您可以随机化此列表,相关部分将保持在一起:

stimulilist=list(csv.reader(open('original_file.csv',"rU")))

stim_1_data = []
stim_2_data = []

for i in range(len(stimulilist)):
    stim_1_data.append(stimulilist[i][0:3])
    stim_2_data.append(stimulilist[i][3:6])

random.shuffle(stim_1_data)
random.shuffle(stim_2_data)

如果您现在想要获取 stim1 和 stim2 的数据,您只需从每个列表中获取一个元素,然后根据需要将这些部分分开:

stim1, locaion1, location2 = stim_1_data.pop()
stim2, locaion3, location4 = stim_1_data.pop()

如果您想要 csv 文件中的另一列,只需添加另一个您不随机化的列表:

stimulilist=list(csv.reader(open('original_file.csv',"rU")))

stim_1_data = []
stim_2_data = []
non_random_data = []

for i in range(len(stimulilist)):
    stim_1_data.append(stimulilist[i][0:3])
    stim_2_data.append(stimulilist[i][3:6])
    non_random_data.append(stimulilist[i][6])

random.shuffle(stim_1_data)
random.shuffle(stim_2_data)

如果您随后需要列表的方式与您最初拥有的每个值分开,您可以再次提取它们:

Stim1, location1,location2 = zip(*stim_1_data)
Stim2, location3,location4 = zip(*stim_2_data)
于 2012-08-09T13:30:53.700 回答