Вычисление дисперсии в ячейках между матрицами в python

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

У меня есть несколько матриц с одинаковыми размерами, X и Y. Я хочу вычислить дисперсию для каждой ячейки по матрицам таким образом, чтобы результирующая выходная матрица также имела одинаковые размеры, X и Y. Например

 matrix1 = [[1,1,1], [2,2,2], [3,3,3]]
matrix2 = [[2,2,2], [3,3,3], [4,4,4]]
matrix3 = [[3,3,3], [4,4,4], [5,5,5]]
 

Используя позицию (0,0) в каждой ячейке в качестве примера, мне нужно сначала вычислить среднее значение, которое будет (1 2 3)/3 = 2

matrix_sum = matrix1 matrix2 matrix3

matrix_mean = matrix_sum / 3

Затем я бы вычислил дисперсию населения, которая будет:

[(1-2) (2-2) (3-2)]^2

И я хотел бы иметь возможность делать это для неопределенного (но небольшого числа) матриц (скажем, 50), а сами матрицы будут иметь максимальное значение 250, 250 (они всегда будут квадратными матрицами)

 for x in range(1,matrix_mean.shape[0]):
        for y in range(1,matrix_mean.shape[1]):
            standard_deviation_matrix.iat[x,y] = pow(matrix_mean.iat[x,y]- matrix1.iat[x,y],2)   pow(matrix_mean.iat[x,y]- matrix2.iat[x,y],2)   pow(matrix_mean.iat[x,y]- matrix3.iat[x,y],2)

standard_deviation_matrix = standard_deviation_matrix / (3-1)

 

Здесь combined_matrix просто (matrix1 matrix2 matrix3 .. matrix5) / 5 (т.Е. Среднее значение в каждой ячейке по матрицам)

Кажется, это работает, но это очень медленно и очень неуклюже; но именно так я бы сделал это на C. Есть ли более простой / лучший / более питонический способ сделать это?

Спасибо

Комментарии:

1. Это типичная проблема numpy. Никаких панд не требуется.

Ответ №1:

Вы можете попробовать:

 all_mat = np.stack([matrix1, matrix2, matrix3])
mat_mean = all_mat.mean(axis=0)
variance = np.var(all_mat, axi=0)
 

Что дает вам:

 array([[0.66666667, 0.66666667, 0.66666667],
       [0.66666667, 0.66666667, 0.66666667],
       [0.66666667, 0.66666667, 0.66666667]])
 

Или для std:

 np.std(all_mat, axis=0)
 

И вы получаете:

 array([[0.81649658, 0.81649658, 0.81649658],
       [0.81649658, 0.81649658, 0.81649658],
       [0.81649658, 0.81649658, 0.81649658]])
 

Ответ №2:

Преобразуйте каждую матрицу в массив numpy, сложите массивы (это добавит еще одно измерение) и вычислите дисперсию по этому измерению:

 m1 = np.array(matrix1)
...
m = np.stack([m1, m2, ...])
m.var(axis=0)
 

Комментарии:

1. Та же идея, что и мой ответ, за исключением того, что вам не нужно преобразовывать каждую матрицу в numpy. np.stack сделал бы это за вас.