Как получить медианные значения по диагональным линиям в матрице?

#python #pandas #numpy

Вопрос:

У меня есть следующая матрица в панд:

 import numpy as np
import pandas as pd

df_matrix = pd.DataFrame(np.random.random((10, 10)))
 

Мне нужно получить вектор, содержащий 10 средних значений, по 1 значению на каждой синей линии, как показано на рисунке ниже:

введите описание изображения здесь

Последнее число в выходном векторе-это в основном 1 число, а не медиана.

Ответ №1:

 X = np.random.random((10, 10))
fX = np.fliplr(X) # to get the "other" diagonal
np.array([np.median(np.diag(fX, k=-k)) for k in range(X.shape[0])])
 

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

1. Привет, согласен с @Quang Hoang. Я пришел к тому же решению, используя np.rot90 вместо np.fliplr

Ответ №2:

Диагонали таковы, что row_num col_num = constant . Таким образом, вы можете использовать stack и суммировать строки/столбцы и groupby :

 (df_matrix.stack().reset_index(name='val')
   .assign(diag=lambda x: x.level_0 x.level_1)  # enumerate the diagonals
   .groupby('diag')['val'].median()             # median by diagonal
   .loc[len(df_matrix):]                        # lower triangle diagonals
)
 

Выход (для np.random.seed(42) ):

 diag
9     0.473090
10    0.330898
11    0.531382
12    0.440152
13    0.548075
14    0.325330
15    0.580145
16    0.427541
17    0.248817
18    0.107891
Name: val, dtype: float64
 

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

1. Спасибо, в моей реальной матрице я получаю эту ошибку в строке .assign(diag=lambda x: x.level_0 x.level_1) : «Ошибка типа: неподдерживаемые типы операндов для : ‘int’ и ‘str'». Знаете ли вы, почему это может произойти?

2. Это связано с тем, что ваши фактические данные имеют строковые имена столбцов. Попробуйте заменить df_matrx на pd.DataFrame(df_matrix.to_numpy()) .