从先前的图像集中绘制 1 张图像 + 从列表中随机绘制 2 张图像 (Python/Psychopy)

Drawing 1 image from previous image set + 2 random images from list (Python/Psychopy)

在下面的代码中,我从列表(目标集)中绘制了 3 张图像,然后将它们显示在屏幕上。接下来,我将在屏幕的不同部分显示另外 3 张图像(图片)。对于第二部分;在 50% 的情况下,我希望 'pics' 图像与最初显示的图像(目标集)相同。我对这部分没问题,我在 x == 0 时设置 pics = targetset(基本上是抛硬币)。

我的问题是,在另外 50% 的情况下,我希望 'pics' 集之一与最初显示的集 (targetset) 之一相同,即三个中的任何一个。我希望从图片列表中随机选择剩下的 2 张。就目前而言,根据我的逻辑,我只能让 'pics' 图像与 'targetset'.

中最初显示的图像完全相同或完全不同

增加问题:当 x==0(使图片=targetset)时,它们都显示正常,但是当 x==1(意思是不做任何改变)时,我收到以下错误消息:

图片[i].pos = 位置[i] UnboundLocalError: 赋值前引用的局部变量 'pics'

这是我的代码:

#create initial target set
imgList1 = glob.glob(os.path.join('stim','*.png'))
random.shuffle(imgList1)
targetset = [visual.ImageStim(window, img) for img in imgList1[:3]]

#initial target set location
setlocation = [(-2,0),(0,0),(2,0)]
random.shuffle(setlocation)

#create target list
imgList = glob.glob(os.path.join('stim', '*.png'))
random.shuffle(imgList)
pics = [visual.ImageStim(window, img) for img in imgList[:3]]

#set target locations
location = [(1,2),(3,3),(5,5)]
random.shuffle(location)

'''define sequential presentation function'''
def seq():
    x = random.randint(0,1)
    if x == 0:
        pics = targetset
    print x

    #display initial target set
    for i in range(3):
        targetset[i].pos = setlocation[i]
        targetset[i].draw()

    window.flip()
    core.wait(3)

    #display targets
    for i in range(3):
        pics[i].pos = location[i]
        pics[i].draw()
        window.flip()
        core.wait(1)

seq()
core.wait(3)
window.close()
quit()

希望有人能帮忙, 干杯 S

我发现您的代码可能存在一些缺陷。一个是您从同一组图像创建两个单独的列表 imgList1imgList,然后分别随机化这些列表中的每一个并将每个列表中的前三个元素拉入 targetsetpics 分别。这些 sub-sets 可能会在图像中有一些重叠。从您对任务的描述来看,我认为这不是故意的。我可能建议只创建 1 imgList,然后使用 imgList.pop() 函数从列表中提取图像。从列表中弹出 returns 最后一个元素,然后从列表中删除该元素。我认为这就像从牌堆中抽一张牌,你不能再抽这张牌,因为它已经不在牌堆中了。你目前所做的就像从两副不同的牌组中抽牌。你可能会得到同一张卡片两次。

我在这里看到的第二个问题是,当您的 coin-flip for x 为 0 时,您定义了一个条件来做什么,但是您没有为 coin-flip 为 1 时定义条件。目前,它只会显示 imgList 的前 3 个图像,因为这就是您定义 pics 的方式。我可能建议在 if/else 块中为您的 x coin-flip 定义 pics。如果为 0,则使用 targetset,如果为 1,则从目标列表中随机选择一个元素,然后将该元素复制到 pics 并从 imgList 中再弹出两个图像。与所有编码一样,解决此问题的方法不止一种,但我将在此处提供一个解决方案。

#Outside the trial loop
imgList = glob.glob(os.path.join('stim', '*.png'))
random.shuffle(imgList)

#Inside the trial loop
targetset = []
for i in range(0,3):
    targetset.append(imgList.pop())
#Do your display stuff with targetset
if random.randint(0,1) == 0:
   pics = targetset
else:
   pics = []
   pics.append(targetset[random.randint(0,2)])
   pics.append(imgList.pop())
   pics.append(imgList.pop())
random.shuffle(pics)
#Do your display stuff with pics