PsychoPy: Как изменить количество элементов в DotStim или ElementArrayStim?

Скажем, я создал файл dots = psychopy.visual.DotStim. Можно ли изменить количество точек позже? dots.nDots = 5 приводит к ошибке на следующем dots.draw(), потому что базовые матрицы не совпадают:

Traceback (most recent call last):
  File "/home/jonas/Documents/projects/work pggcs/experiment/dots.py", line 32, in <module>
    dots_right.draw()
  File "/usr/lib/python2.7/dist-packages/psychopy/visual/dot.py", line 279, in draw
    self._update_dotsXY()
  File "/usr/lib/python2.7/dist-packages/psychopy/visual/dot.py", line 362, in _update_dotsXY
    self._verticesBase[:,0] += self.speed*numpy.reshape(numpy.cos(self._dotsDir),(self.nDots,))
  File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 218, in reshape
    return reshape(newshape, order=order)
ValueError: total size of new array must be unchanged

То же самое относится и к psychopy.visual.ElementArrayStim, для которого установка stim.nElements = 5 аналогичным образом приводит к ошибке при следующем розыгрыше.

Решение, конечно, состоит в том, чтобы создавать новый экземпляр DotStim или ElementArrayStim каждый раз, когда количество точек/элементов должно измениться, но это кажется слишком тяжелым.


person Jonas Lindeløv    schedule 14.09.2015    source источник


Ответы (2)


Это можно исправить для DotStim:

dots.nDots = 5
dots._dotsDir = [0]*dots.nDots
dots. _verticesBase = dots._newDotsXY(dots.nDots)

Это устанавливает движение всех точек на 0, но вы можете изменить это значение на любое другое или указать для отдельных точек. Это хак, который, скорее всего, сломается, если вы измените другие аспекты DotStim.

Я не нашел решения для ElementArrayStim.

person Jonas Lindeløv    schedule 14.09.2015

Да, было бы неплохо иметь возможность сделать это, но я не дошел до этого. Код, который нужно запускать при изменении nDots/nElements, довольно близок к тому, чтобы начать с нуля с новым стимулом. инициализируйте код в setNDots(), а затем вызовите его из инициализации).

Существует дополнительная потенциальная проблема, которая заключается в том, что элементы могли измениться (например, пользователь установил ориентацию), а затем обновить количество элементов. Какие удаляем? И какую ориентацию мы придаем тем, что добавляем? (Хотя для DotStim это не так важно)

В принципе, вопрос немного щекотлив и не является для меня приоритетом.

person Jon    schedule 15.09.2015
comment
Да, это были и мои мысли, когда я смотрел на код. Вот почему я не отправил запрос на вытягивание. Думаю, мы могли бы удалить точки случайным образом или добавить случайным образом выбранные копии существующих точек. Это будет близко к желаемому поведению в 80% случаев использования? Но пока я просто хотел, чтобы это грязное исправление можно было найти в Google. - person Jonas Lindeløv; 17.09.2015