2016-04-14 1 views
1

Я пытаюсь запустить программу балансировки счетчика. Я не могу понять, что делает Python, чтобы получить вывод, который я получаю. У меня есть 8 вариантов из 16 карт. Варианты определяются 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, Л.Л. -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], как истинные, то я хочу, чтобы они были Ложными. MapGroups[0] был назначен СС, теперь он должен быть 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' 

Тем не менее, простым поворотом конд массива действительно решает мою проблему

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" 

Я сидел на этом уже три дня, и я не могу понять, почему начальное реверсирования решение не дает желаемых результатов.

+0

Хм, но почему реверсирование строк также не отменяет присвоение индекса в '[condsreverse [cRow [group] -1] [i] для i в MapGroups [group]]' –

+1

Hrm, я должен сказать, что я тщательно разобравшись между различными матрицами, которые у вас есть в вашем коде, и тем, что происходит в обратном порядке. –

+0

Извините за путаницу. У меня есть два случая разворота, которые можно рассматривать как отдельные. Как вы говорите, в одном я меняю столбцы, а в другом я меняю строки. Второй снипп меняет строки в матрице, меняя списки. 3-й снипп я отбрасываю столбцы. Однако, если вы рисуете реверсирование строк, это должно иметь тот же эффект, что и разворот столбца. Тем не менее, я получаю два разных выхода, в зависимости от того, что я делаю. Понятно, что моя процедура смены строки - это недостаток, но я отлаживал ее и не могу понять, почему. –

ответ

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: Я думаю писать это помогло мне осознать свою вину. Прошу прощения.

+0

Вы только что обнаружили [отладка резиновой утки] (https://en.wikipedia.org/wiki/Rubber_duck_debugging). –

Смежные вопросы