gpt4 book ai didi

psychopy - 了解 PsychoPy 的数据记录

转载 作者:行者123 更新时间:2023-12-02 19:17:21 24 4
gpt4 key购买 nike

我有一个测试 PsychoPy Builder 脚本,我用它来调查一些反直觉的行为。其结构为四个例程:

“Init”,不在循环中,“Begin Experiment”中的代码如下:

x = 0
y = 0
z = 0
foo = [0, 0, 0]

“一”,循环中,“结束例程”中的以下代码:

x = x + 1
foo[0] = foo[0] + 1

thisExp.addData("x", x)
thisExp.addData("y", y)
thisExp.addData("z", z)
thisExp.addData("foo", foo)

“二”,循环中,“End Routine”中的以下代码:

y = y + 2
foo[1] = foo[1] + 2


thisExp.addData("x", x)
thisExp.addData("y", y)
thisExp.addData("z", z)
thisExp.addData("fooY", foo[1])
thisExp.addData("foo", foo)

“三”,循环中,“结束例程”中的以下代码:

z = z + 3
foo[2] = foo[2] + 3

thisExp.addData("x", x)
thisExp.addData("y", y)
thisExp.addData("z", z)
thisExp.addData("foo", foo)

没有其他代码,没有其他组件。例程“一”、“二”和“三”按该顺序形成一个循环,执行五次。 CSV输出文件的相关列如下:

trials.thisRepN trials.thisTrialN   trials.thisN    trials.thisIndex    x   y   z   foo         fooY
0 0 0 0 1 2 3 [5, 10, 15] 2
1 0 1 0 2 4 6 [5, 10, 15] 4
2 0 2 0 3 6 9 [5, 10, 15] 6
3 0 3 0 4 8 12 [5, 10, 15] 8
4 0 4 0 5 10 15 [5, 10, 15] 10

这是预期的输出吗?如果是这样,为什么?请注意,各个变量 x、y 和 z 每次通过循环(在循环结束时)都会显示更新的值,而列表 foo 仅显示循环迭代五次后的最终值,但它在每一行中都显示了这一点。但调出列表中的各个元素会像各个变量一样显示。

这背后的逻辑和原理是什么?

有没有办法让列表输出像其他输出一样执行?

有没有办法强制输出在调用 addData() 时捕获/显示任何这些变量,而不是等到循环结束?

最佳答案

我想我知道这里出了什么问题。这可能是因为 python 通过引用而不是复制来分配。这在其他地方有详细但简短的解释,

original = [1, 2]
new = original # new is simply a reference to original! It is not a copy.
new[0] = 'Oops' # original is now ['Oops', 2] as is new (which is just a reference or pointer

在您的例子中,TrialHandler 接收引用,该引用仅指向在整个实验过程中更新的“foo”变量。由于日志仅在实验结束时保存,因此“foo”中的所有行现在都指向“foo 变量”,该变量现在保存值 [5, 10, 15]。

这种按引用分配可能非常漂亮和方便,但有时会像您的示例中那样引起头痛。它适用于所有 Python 可变变量:列表、字典、函数和类。但不适用于不可变的东西,比如数字、元组和字符串!这就是为什么您的脚本适用于数字但不适用于列表。

有不同的解决方案。最简单的可能是将 addData 调用替换为 thisExp.addData("foo", tuple(foo)) ,它将可变列表转换为不可变元组。还可以执行 thisExp.addData("foo", [x for x in foo])。针对各种对象的更全面的解决方案是在实验开始时运行 import copy ,然后添加数据,如 thisExp.addData("foo", copy.copy(foo )) 在其他代码块中(如果您有一个复杂的对象,请使用 copy.deepcopy 代替)。

关于psychopy - 了解 PsychoPy 的数据记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29362421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com