PsychoPy入門_05_循環(huán)和隨機(jī)

不靠譜PsychoPy入門教程目錄:

  1. PsychoPy入門00安裝

  2. PsychoPy入門01文字和圖片的呈現(xiàn)

  3. PsychoPy入門02按鍵等待&反應(yīng)時(shí)

  4. PsychoPy入門03視頻和音頻的呈現(xiàn)

  5. PsychoPy入門04等級(jí)評(píng)定

  6. PsychoPy入門05循環(huán)和隨機(jī)

  7. PsychoPy入門06數(shù)據(jù)記錄

  8. PsychoPy入門07鼠標(biāo)的使用

  9. 用PsychoPy做視覺搜索任務(wù)實(shí)驗(yàn)


做實(shí)驗(yàn)的時(shí)候一種條件下一般會(huì)多個(gè)trials,我們不可能把每一個(gè)刺激的呈現(xiàn)過程都寫一遍,會(huì)煩死的。過程一樣,內(nèi)容不同,用循環(huán)就變得非常簡單了。

比如上次我們對一張圖片做等級(jí)評(píng)定,評(píng)定它好不好看,喜歡程度如何?,F(xiàn)在我有一組圖片,都要做評(píng)定,怎么讓它循環(huán)呢?

把前次的程序復(fù)制過來,作為這次的起始代碼:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

#示例4
'''
    等級(jí)評(píng)定
'''
#載入所需要的庫
from psychopy import visual, core, event

#創(chuàng)建窗口
win = visual.Window(fullscr = False, size = (1000,600),
                    color = (-1.0,-1.0,-1.0), units = 'norm', monitor = 'testMonitor')

#評(píng)定內(nèi)容
pic = visual.ImageStim(win, image = 'test_1.jpg', pos = (0.0,0.4))
item = visual.TextStim(win, text = u'', pos = (0.0,-0.1))

#量表
scale_1 = visual.RatingScale(win, choices = [u'ugly',u'WTH',u'nice'], pos = (0.0,-0.6))
scale_2 = visual.RatingScale(win, scale = u'1=非常不喜歡 . . . . . . . . . . . 7=非常喜歡',
                                low =1, high = 7, precision = 1, pos = (0.0,-0.6),
                                marker = 'circle', showValue = True,
                                acceptPreText = u'請?jiān)跈M線上點(diǎn)擊')
#呈現(xiàn)
item.text = u'這張圖給你的感受是?'
scale_1.reset()
while scale_1.noResponse:
    pic.draw()
    item.draw()
    scale_1.draw()
    win.flip()
print 'scale 1:', scale_1.getRating(), scale_1.getRT()

item.text = u'評(píng)定你對著張圖片的喜愛程度。'
scale_2.reset()
while scale_2.noResponse:
    pic.draw()
    item.draw()
    scale_2.draw()
    win.flip()
print 'scale 2:', scale_2.getRating(), scale_2.getRT()

win.close()
core.quit()

循環(huán)

我找了10張羅夏墨跡圖片,把他們的名字放在一個(gè)list里:

pics = ['test_1.jpg','test_2.jpg','test_3.jpg','test_4.jpg','test_5.jpg','test_6.jpg','test_7.jpg','test_8.jpg','test_9.jpg','test_10.jpg']

你自己隨便找?guī)讖垐D片,把尺寸裁成一樣的,名字改好。

對不同圖片做等級(jí)評(píng)定的時(shí)候差別只在于pic這個(gè)圖片刺激的image不同,所以我們只需要在每次循環(huán)的時(shí)候把pic.image重新賦值就好了。下面寫一下循環(huán)的語句:

for i in range(len(pics)):
    pic.image = pics[i]
    # 呈現(xiàn)
    # ...

len(list)得到的是這個(gè)list的長度,pics里面有10個(gè)東西,len(pics)等于10。range(10)得到的是一個(gè)從0到10(不包含)10的列表。這樣就是循環(huán)10次,第一次pic.image等于pics里的第一個(gè)項(xiàng)目,第二次是第二個(gè),依次往后,直到最后一個(gè)。

下面呈現(xiàn)的部分直接用前面的代碼,統(tǒng)一縮進(jìn)到for循環(huán)里就行。

運(yùn)行一下,這樣就是對10張圖片進(jìn)行評(píng)定了對吧。(P.S.如果你沒耐心一個(gè)個(gè)點(diǎn)下去,返回主界面,點(diǎn)紅色的叉叉退出去就行。)

這里名字有規(guī)律的話,其實(shí)可以更加簡化。不需要pics這個(gè)list,直接修改pic.image那里。比如:

pic.image = 'test_'+str(i)+'.jpg'

我就還是用上面的pics啦。

隨機(jī)

實(shí)驗(yàn)設(shè)計(jì)里面隨機(jī)是個(gè)常用的手段。為了消除首因效應(yīng)、近因效應(yīng)之類的。

在python程序里要使用隨機(jī)函數(shù)需要先載入random庫。

import random

要隨機(jī)圖片的順序很簡單,把list里圖片的順序打亂一下就好了。

random.shuffle(pics)

OK,這樣評(píng)定圖片的順序就隨機(jī)了。輕松加愉快~!


本次的完整代碼如下:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

#示例5
'''
    循環(huán)。隨機(jī)
'''

#載入所需要的庫
from psychopy import visual, core, event
import random

#創(chuàng)建窗口
win = visual.Window(fullscr = False, size = (1000,600),
                    color = (-1.0,-1.0,-1.0), units = 'norm', monitor = 'testMonitor')

#文字
text_1 = visual.TextStim(win, text = u'示例5', height = 0.12, pos = (0.0,0.2), color = 'pink')
text_2 = visual.TextStim(win, text = u'', height = 0.1, pos = (0.0,-0.2), color = 'skyblue')
text_2.text= u'循環(huán)'

#呈現(xiàn)文字刺激
text_1.draw()
text_2.draw()
win.flip()
core.wait(2)

#評(píng)定內(nèi)容
pic = visual.ImageStim(win, image = 'test_1.jpg', pos = (0.0,0.4))
item = visual.TextStim(win, text = u'', pos = (0.0,-0.1))
item.text = u'這張圖給你的感受是?'

#量表
scale_1 = visual.RatingScale(win, choices = [u'ugly',u'WTH',u'nice'], pos = (0.0,-0.6))
scale_2 = visual.RatingScale(win, scale = u'1=非常不喜歡 . . . . . . . . . . . 7=非常喜歡',
                                low =1, high = 7, precision = 1, pos = (0.0,-0.6),
                                marker = 'circle', showValue = True,
                                acceptPreText = u'請?jiān)跈M線上點(diǎn)擊')
pics = ['test_1.jpg','test_2.jpg','test_3.jpg','test_4.jpg','test_5.jpg','test_6.jpg','test_7.jpg','test_8.jpg','test_9.jpg','test_10.jpg']
random.shuffle(pics)

#呈現(xiàn)
for i in range(len(pics)):
    pic.image = pics[i]
    scale_1.reset()
    item.text = u'這張圖給你的感受是?'
    while scale_1.noResponse:
        pic.draw()
        item.draw()
        scale_1.draw()
        win.flip()
    print 'scale_1:',scale_1.getRating(),scale_1.getRT()
    item.text = u'評(píng)定你對著張圖片的喜愛程度。'
    scale_2.reset()
    while scale_2.noResponse:
        pic.draw()
        item.draw()
        scale_2.draw()
        win.flip()
    print 'scale_2:',scale_2.getRating(),scale_2.getRT()

P.S. 在真正設(shè)計(jì)實(shí)驗(yàn)程序的時(shí)候,你會(huì)發(fā)現(xiàn)前面這些呈現(xiàn)刺激這一大堆是最簡單的。都是固定的。復(fù)雜的地方在你實(shí)驗(yàn)材料的分配,實(shí)驗(yàn)流程的控制等等。

就醬。有什么疑問或建議請?jiān)谙路皆u(píng)論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容