#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
сделал бы это за вас.