Я пытаюсь провести эксперимент, в котором папка сканируется на наличие изображений. Для каждого испытания отображается цель и несколько (7) изображений дистрактора. После этого в половине испытаний людям показывают целевое изображение, а в другой половине - изображение, которого не было на предыдущем дисплее.
Мой текущий код вроде работает, но только если испытаний меньше, чем объектов:
repeats = 20
# Scan dir for images
jpgs = []
for path, dirs, files in os.walk(directory):
for f in files:
if f.endswith('.jpg'):
jpgs.append(f)
# Shuffle up jpgs
np.random.shuffle(jpgs)
# Create list with target and probe object, Half random, half identical
display = []
question = []
sameobject = []
position = np.repeat([0,1,2,3,4,5,6,7], repeats)
for x in range(1,(repeats*8)+1):
display.append(jpgs[x])
if x % 2 == 0:
question.append(jpgs[-x])
sameobject.append(0)
else:
question.append(jpgs[x])
sameobject.append(1)
# Concatonate objects together
together = np.c_[display,question,position,sameobject]
np.random.shuffle(together)
for x in together:
# Shuffle and set image
np.random.shuffle(jpgs)
myList = [i for i in jpgs if i != together[trial,0]]
myList = [i for i in myList if i != together[trial,1]]
# Set correct image for target
myList[int(together[trial,2])] = together[trial,0]
Прежде всего, я понимаю, что это ужасный код. Но он выполняет свою работу грубо. С 200 JPG и повторением 20 он работает. Если повторение установлено на 30, происходит сбой.
Вот пример с слишком большим повторением:
File "H:\Code\Stims\BetaObjectPosition.py", line 214, in <module>
display.append(jpgs[x])
IndexError: list index out of range
Есть ли способ обновить мой код таким образом, чтобы разрешить больше испытаний, в то время как все объекты используются как можно более равномерно (один объект не должен отображаться 3 раза, а другой отображается 0) в течение всего эксперимента?
Бонусные баллы, если кто-то может увидеть очевидный способ сбалансировать способ выбора 7 отвлекающих изображений.
Спасибо, что нашли время прочитать это. Надеюсь, ты сможешь мне помочь.