Как загрузить матрицу tri angular и сделать ее симметричной - PullRequest
0 голосов
/ 06 февраля 2020

Учитывая три angular матрицу m в python, как наилучшим образом извлечь из нее значение в строке i столбец j?

m = [1,np.nan,np.nan,2,3,np.nan,4,5,6]
m = pd.DataFrame(np.array(x).reshape((3,3)))

Что выглядит следующим образом:

    0   1   2
0   1.0 NaN NaN
1   2.0 3.0 NaN
2   4.0 5.0 6.0

Я могу легко получить нижние элементы m[2,0] возвращает 4.

Но если я попрошу m[0,2], я получу nan, когда снова захочу 4.

Как лучше всего это сделать в python?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Используйте pandas.DataFrame.fillna с транспонированием:

m = m.fillna(m.T)
print(m)

Вывод:

     0    1    2
0  1.0  2.0  4.0
1  2.0  3.0  5.0
2  4.0  5.0  6.0

m.loc[0,2] == m.loc[2,0] == 4
# True

В случае, если есть имена столбцов (например, A, B, C):

m.where(m.notna(), m.T.values)

Вывод:

     A    B    C
0  1.0  2.0  4.0
1  2.0  3.0  5.0
2  4.0  5.0  6.0
0 голосов
/ 06 февраля 2020

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

Существует несколько шагов:

  1. Конвертировать nan в 0
m0 = np.nan_to_num(m)
Добавьте транспонирование матрицы к себе
m = m0 + m0.T
Вычтите диагональ
m = m - np.diag(m0.diagonal())

Тогда m[0,2] и m[2,0] оба дадут вам 4.

    0   1   2
0   1.0 2.0 4.0
1   2.0 3.0 5.0
2   4.0 5.0 6.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...