或者说是用最鞋垫的方式编写实验条件...

诡异的起因

事情是这样的
前几天一个同学那里做实验,猛然发现她用的是psychopy
不过在那时,我对于psychopy的使用基本只限于怎么用图形化窗口无代码编写...

于是等到师姐找我要实验的时候,我果断地决定用psychopy再写一份
从昨天晚上七点多决定开始重写到今天晚上九点左右写完,期间也想过放弃,挣扎了很久
不过最后今天课上摸了一天鱼写完了这个程序

基本思路

下面简单介绍一下我的思路吧
对于基本使用方法,欢迎同学们移步https://www.bilibili.com/video/BV1n7411d7A3/?p=5&spm_id_from=333.880.my_history.page.click&vd_source=87c6c28fcae6a8081f0766f28260a02e,听声音很好听很治愈的鱼饼小姐姐讲一下如何使用图形界面写一个大概的实验框架

那么,接下来,对于一个稍微复杂一点的实验来说,重点在于怎么弄好那个表格,或者怎么在实验中修改代码达到实验设计的目的。
中国人嘛,向来是喜欢调和的。尤其是我看到这玩意生成的七百多行代码之后就并不打算在程序上做太多修改了...
因此,我使用的方法是:通过python编写一个实验表格,然后进行以表格为condition的实验

生成表格

python生成表格算是python学习中的基本操作了...
虽然有点犹豫把源代码直接放出来会不会不好,但想到这个实验范式还是比较基础的,并且师姐做实验向来是在图片素材之类诡异的地方异常狂野,所以应该不算透露核心机密吧

这里有个坑必须要说一下
最开始用的时候是xlwt,结果弄出来的表格莫名报错
具体使用上参考了这篇文章https://blog.csdn.net/linjcai/article/details/81608309
之后去问了gy师兄,他说xlwt太原始了,于是用pandas重写了一遍...
还是报错
最后我发现,这个列标签不能有空格!
或许这个发现值得我单拿出来写一篇文章

from random import shuffle
import pandas as pd
import numpy as np
    
#实验设计:图片刺激(两组),靶子判断,两者呈现位置的一致不一致条件(1:2的比例)
#Condition:File Path; Stim position; Target postion(Consistence)
#每组图片的随机呈现序列
group=54
group1=range(1,group+1)
group1=list(group1)
group2=range(1,group+1)
group2=list(group2)
shuffle(group1)
shuffle(group2)
    
#呈现哪一组的图片(0:第一组;1:第二组)
pic=np.zeros(group)
tmp=np.ones(group)
pic=list(pic)
tmp=list(tmp)
pic=pic+tmp
shuffle(pic)
    
#图片的路径:文件夹+组内序号
filepath=[]
i1=0
i2=0
for i in range(2*group):
    if pic[i]==0:
        file='pic\\组一\\'+'one'+str(int(group1[i1]))+'.bmp'
        i1+=1
    else:
        file='pic\\组二\\'+'two'+str(int(group2[i2]))+'.bmp'
        i2+=1
    filepath.append(file)
    
#图片位置:0(L),1(R)
stim_position=[]
pos=np.zeros(group)
tmp=np.ones(group)
pos=list(pos)
tmp=list(tmp)
pos=pos+tmp
shuffle(pos)
for i in range(2*group):
    if pos[i]==0:
        position=[-0.5,0]
    else:
        position=[0.5,0]
    stim_position.append(position)
    
#图片与靶子位置是否一致  不一致:0;一致:1
#每组图片被分配到一致和不一致条件下的比例为2:1(一致组36次,不一致组18次)
target=list(np.zeros(108))
consistence=list(np.zeros(108))
corr=np.ones(36)
diff=np.zeros(18)
corr=list(corr)
diff=list(diff)
consist=corr+diff
shuffle(consist)
    
i1=0
i2=0
for i in range(2*group):
    if pos[i]==0:
        if consist[i1]==0:
            position=[0.5,0]
        else:
            position=[-0.5,0]
        tmp=consist[i1]
        i1+=1
    else:
        if consist[i2]==0:
            position=[-0.5,0]
        else:
            position=[0.5,0]
        tmp=consist[i2]
        i2+=1
    target[i]=position
    consistence[i]=tmp
    
key=[]
for i in range(2*group):
    if target[i]==[-0.5,0]:
        key.append('f')
    else:
        key.append('j')
    
dataframe = pd.DataFrame({'File_Path':filepath,'Stim_position':stim_position,'Target_postion':target,'Consistence':consistence,'Correct':key})
#dataframe.to_csv("test.csv",index=0)
dataframe.to_excel('test.xlsx', sheet_name='Sheet1', index=False) # index false为不写入索引

以上是生成表格部分的代码,因为比较小白所以诸位大佬可以看个乐呵...
我自己也觉得很多处理的地方很笨拙
实验的具体要求可以看代码中的注释行

邪教操作

既然已经有了生成表格的程序,我们不由地产生了一个大胆的想法
每次运行generate.py产生新表格实在是太麻烦了,我们不妨把他集成到之前的实验框架里面

我把之前展示的generate.py直接全文复制到实验程序import与正文之间的部分,于是得到了一个完整的,可以随机产生condition的python程序
具体运行也符合预期

后记

psychopy可以直接在builder里面添加code..
感觉我像个小丑,不过总思路倒是没什么大错误
虽然code组件也是一样的实现,但总归还是更加优雅

实验程序就不放了,毕竟不是我自己的实验XD
最后修改:2023 年 01 月 04 日
请我喝杯可乐?