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

从以前的图像集中绘制1个图像+;列表中的2个随机图像(Python/Psychopy),python,psychopy,Python,Psychopy,在下面的代码中,我从列表(targetset)中绘制了3幅图像,然后将它们显示在屏幕上。接下来,我将在屏幕的不同部分显示另外3个图像(图片)。第二部分;在50%的情况下,我希望“pics”图像与最初显示的图像相同(目标集)。我对这部分没意见,当x==0时,我设置pics=targetset(基本上是掷硬币) 我的问题是,在其他50%的情况下,我希望其中一个“图片”集与原始显示集(targetset)中的一个相同,三个中的任何一个。我希望剩下的2个从图片列表中随机选择。目前,根据我的逻辑,我只能得

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

我的问题是,在其他50%的情况下,我希望其中一个“图片”集与原始显示集(targetset)中的一个相同,三个中的任何一个。我希望剩下的2个从图片列表中随机选择。目前,根据我的逻辑,我只能得到与“targetset”最初显示的图像相同或不同的“pics”图像

增加问题:当x==0(使pics=targetset)时,它们都显示ok,但当x==1(表示不进行更改)时,我会收到以下错误消息:

pics[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()
我希望有人能帮忙, 干杯
我发现您的代码可能存在一些缺陷。一种是从同一组图像中创建两个单独的列表
imgList1
imgList
,然后分别对这些列表进行随机分组,并将每个列表中的前三个元素分别拉入
targetset
pics
。这些子集可能在图像中有一些重叠。从你的任务描述来看,我认为这不是故意的。我可能建议只创建1个
imgList
,然后使用
imgList.pop()
函数从列表中提取图像。Pop返回列表中的最后一个元素,然后从列表中删除该元素。我认为这就像从牌组中抽一张牌,你不能再抽一次牌,因为它不再在牌组中。你现在所做的就像是从两个不同的牌组中抽牌。你可能会得到同一张卡两次

我在这里看到的第二个问题是,你定义了一个条件,当你对x的抛硬币是0时,你该做什么,但是当你的抛硬币是1时,你没有定义一个条件。目前,它将只显示
imgList
中的前3个图像,因为这就是您定义
pics
的方式。我可能建议在if/else块中定义x硬币翻转的
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 

我不确定你是否应该把这当作一个新问题,因为它似乎是这篇文章的一部分:[不过,请检查你的缩进。
def seq()之后的所有内容]:
是该功能的一部分。这可能不是您想要的。感谢您的回复。我将其作为不同的帖子,因为我认为这是一个不同的问题,我认为我无法继续对话,因为我的错误是,答案已被接受。我希望这些信息包含在我的功能中,但我不明白为什么会出现e出现错误消息。作为更新,我已通过将“全局图片”添加到函数顶部来修复错误消息。关于使用前一组“targetget”中的一个图像的另一个问题,您能否帮助我?您有两个列表
targetset
pics
。当满足条件时,您需要
targetset中的一个图像和两个来自
pics
,如果不满足条件,则将所有三个
pics
保持原样。是否正确?如果正确,您可以使用
random.sample
random choice
函数(在此处找到它们:[)。
newpics=r.sample(pics,2);newpics.append(r.choice(targetset))
如果您想更改顺序,请注意,其中一些函数会更改原始列表(即shuffle)。通常,您可能希望远离全局变量。