почему Python несовместим при интерпретации вычитания при составлении списка? - PullRequest
1 голос
/ 09 сентября 2010

Я делаю небольшую программу, и в какой-то момент из каждой строки матрицы мне нужно вычесть среднее значение самой строки.Совершенно стандартная процедура перенормировки.

Примечание в коде

def subtractaverage(data):
    datanormalized=[]
    for row in data:
        average_row=sum(row)/len(row)
        print "average=",average_row
#       renormalized_row=[cell-average_row for cell in row]
        renormalized_row=[-average_row+cell for cell in row]        
        datanormalized.append(renormalized_row) 
    matrixnormalized=np.array(datanormalized)
    return matrixnormalized

Строки: # renormalized_row = [cell-average_row для ячейки в строке] renormalized_row = [- average_row + ячейка для ячейки встрока]

Сначала я попробовал первую строку (cell-average_row), и она НЕ работала.В результате renormalized_row оказался равным строке.

Тогда вторая строка вместо этого работала.Так что почему-то кажется, что компилятор интерпретирует [cell-average_row для ячейки в строке] как [ячейка для ячейки в строке].

Но если я напишу:

renormalized_row=[cell-100 for cell in row] 

, он работает нормально(и создает новый список со значением 100, вычитаемым из каждой ячейки. Я попробовал другую небольшую программу, затем:

rs=range(10)
val=5
t=[r-val for r in rs]
print t,rs

Это также работает и производит

[- 5,-4, -3, -2, -1, 0, 1, 2, 3, 4] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

как и должно быть.

Так что теперь я в растерянности. Да, я могу использовать renormalized_row = [- average_row + ячейка для ячейки в строке], но я хотел бы понять, что происходит. Почему это очевиднонесоответствие в способе интерпретации выражения.

Я использую python2.6.5 (2.6.6 не будет иметь .dmg для Mac) на OSX 10.6.4

Спасибо

Попытка программы на следующий день, на других наборах данных, на самом деле сработала. Снова тестируя ее на исходных данных, она снова работает. Я еще более сбит с толку. Но я знаю, что даже скучаю по «Казус Белли», чтобы показать, чточто-то не работает как надо.

Можем ли мы закрыть этот вопрос

1 Ответ

2 голосов
/ 09 сентября 2010

Полагаю, проблема в целочисленном делении (если row состоит только из целых чисел)

average_row=sum(row)/len(row)

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

average_row=sum(row)/float(len(row))

вместо.

...