1

我正在尝试运行一个反平衡程序。我无法理解 Python 正在做什么来获得我收到的输出。我有 16 张地图的 8 种变体。变体由timingConditions*定义distractionConditions。初始变量定义有 4 个关键部分:

  1. inst是一个包含所有 8 个变体 * 16 个按变体排序的实验地图的列表(这些地图实际上就像一个视频游戏地图)。这就离开了len(inst) = 128
  2. inst中细分为 8 个子列表conds。这些子列表中的每一个都代表特定变体的映射 1-16。子列表中的每个索引代表一个映射/变体组合。调用每个子列表的索引conds会清楚地显示这一点。
  3. 这 16 个地图分为 8 个列表,每个列表包含两个地图,在变量中定义MapGroups。这 8 个列表用于下面的矩阵。

  4. counterBalanceMatrix表示映射到条件分配的八个唯一平衡排序。中的每个主题range(1,9)都分配到这些行之一。行中的数字代表地图组。列(即索引排序)表示将变量分配给映射组。例如,counterBalanceMatrix[0][0]返回1,第一个索引对应第一个变量列的赋值SSTrue;第二个索引对应于MapGroups[0](将返回'0','15')。因此,所需的输出将是映射 0 和 15(或没有基于零的排序的 1 和 16)分配为 SS-True。你可以这样描绘:

            ####+--------+--------+--------+--------+---------+---------+---------+---------+
            ####| SSTrue | SLTrue | LSTrue | LLTrue | SSFalse | SLFalse | LSFalse | LLFalse |
            ####+--------+--------+--------+--------+---------+---------+---------+---------+
            ####|      1 |      2 |      3 |      4 |       5 |       6 |       7 |       8 |
            ####|      2 |      3 |      4 |      5 |       6 |       7 |       8 |       1 |
            ####|      3 |      4 |      5 |      6 |       7 |       8 |       1 |       2 |
            ####|      4 |      5 |      6 |      7 |       8 |       1 |       2 |       3 |
            ####|      5 |      6 |      7 |      8 |       1 |       2 |       3 |       4 |
            ####|      6 |      7 |      8 |      1 |       2 |       3 |       4 |       5 |
            ####|      7 |      8 |      1 |      2 |       3 |       4 |       5 |       6 |
            ####|      8 |      1 |      2 |      3 |       4 |       5 |       6 |       7 |
            ####+--------+--------+--------+--------+---------+---------+---------+-----  ----+
    

低于 的代码的预期输出,subject in range(1,9):将有每个 的一个实例MapGroup,以及每个变体的两个观察值(例如 SS-TRUE、LL-False 等)。在所有主题中,将对所有MapGroups和变体进行相同的观察。这部分代码按预期工作

import re
timingConditions = ["SS","SL","LS","LL"]
distractionConditions = ["True","False"]
maps = [i for i in range(1,17)]

#This loop sets up the 128 (16*8) variants. Inst for instances of scenario.
inst = []
for d in distractionConditions:
    for t in timingConditions:
        for map in maps:
            inst.append(str(str(map)+"-"+t+"-"+d))

conds = [inst[0:16],inst[16:32],inst[32:48],inst[48:64],inst[64:80],inst[80:96],inst[96:112],inst[112:128]]

MapGroups= [[0,8],
[1,9],
[2,10],
[3,11],
[4,12],
[5,13],
[6,14],
[7,15]]

counterBalanceMatrix= [[1,2,3,4,5,6,7,8],
[2,3,4,5,6,7,8,1],
[3,4,5,6,7,8,1,2],
[4,5,6,7,8,1,2,3],
[5,6,7,8,1,2,3,4],
[6,7,8,1,2,3,4,5],
[7,8,1,2,3,4,5,6],
[8,1,2,3,4,5,6,7]]

for subject in range(1,9):
    cRow = counterBalanceMatrix[(subject-1)%8]#Use the modulus operator to find out which row to use in counterbalancing for this subject.
    scenArray = []

    for group in range(0,8):#This loops across map groups and look up their assigned interruption condition
        scenArray.extend([conds[cRow[group]-1][i] for i in MapGroups[group]]) 
        print "****","Participant",subject,"Correct Day 1****"
        print scenArray
        print "\n\n"

这就是问题所在: 我想重复这个过程,但是被镜像了。也就是说,无论每个变量list in MapGroups最初分配什么,我都希望它被反转(例如,如果您收到MapGroups[0]为 True,那么我希望它们为 False。MapGroups[0]分配了 SS,现在它必须是 LL。

我最初的解决方案是反转counterBalanceMatrix并应用相同的循环。然而这并没有奏效:

counterBalanceMatrixReverse= []
for list in counterBalanceMatrix:
    counterBalanceMatrixReverse.append(list[::-1])

###And then run the exact same loop over.
for subject in range(1,9):
    cRow = counterBalanceMatrixReverse[(subject-1)%8]
#
    scenArray = []
    for group in range(0,8):
        scenArray.extend([conds[cRow[group]-1][i] for i in MapGroups[group]])
        print "****","Participant",subject,"Broken Reversed 2****"
        print scenArray
        print "\n\n" 

输出不正确,例如:

>Participant 4 
>'2-SL-True', '10-SL-True'
Participant 4 Reversed
>'2-SS-False', '10-SS-False'
Exptected Reversed Ouput:
>'2-LS-False', '10-LS-False'

但是,简单地反转 cond 数组确实解决了我的问题

condsreverse = []
condsreverse.extend(conds[::-1])

for subject in range(1,9):
    cRow = counterBalanceMatrix[(subject-1)%8]#Note I use same matrix
    scenArray = []
    for group in range(0,8):
        scenArray.extend([condsreverse[cRow[group]-1][i] for i in MapGroups[group]]) 
    print "****","Subject",subject,"Correct Reverse****"
    print scenArray
    print "\n\n"

我已经坐了三天了,我无法弄清楚为什么最初的反转解决方案没有产生所需的输出。

4

1 回答 1

1

我相信解决方案如下,如果只是为了结束问题。

我的错误是我假设[conds[cRow[group]-1]是根据 的索引分配变体,cRow[i]cRow[i]只是用于调用特定的地图。但是,实际上所做的是根据 的值分配变体cRow[i]。因此,没有MapGroups根据索引分配“列”。这意味着简单地反转counterBalanceMatrix基本上只是创建另一个版本的counterBalanceMatrix.

我可以获得相互镜像的条件的唯一方法是颠倒顺序,conds因为这是实际在分配中使用的列表;除非我当然想更改scenArray.extend([condsreverse[cRow[group]-1][i] for i in MapGroups[group]])为每个项目的调用索引(对于原始和反向),然后基于该索引调用地图组,如下所示:

for index in range(0,8):
    scenArray.extend([conds[index][i] for i in MapGroups[cRow[index]-1]])

PS:我想把它写成一个问题帮助我意识到我的错。非常遗憾。

于 2016-04-14T10:14:32.787 回答