Преобразование матрицы смежности в вектор

#python #numpy #adjacency-matrix

Вопрос:

Я хотел бы преобразовать матрицу смежности в вектор. Я уже придумал решение, которое работает, но кажется чрезмерно сложным (используя обходной путь с пандами). Должен быть более простой способ сделать это?

Пример:

 import numpy as np
import pandas as pd

A = np.array([[0,1,2,3],
              [1,0,1,0],
              [2,1,0,0],
              [3,0,0,0]],
             dtype=float)

il = np.tril_indices(len(A))
A[il] = np.nan
A_df = pd.DataFrame(A)
A_stacked = A_df.stack().reset_index()
A_vector = A_stacked[0]
 

что дает вам:

 0    1.0
1    2.0
2    3.0
3    1.0
4    0.0
5    0.0
Name: 0, dtype: float64
 

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

1. Делает np.triu_indices(len(A),k=1) и A[iu] делает эту работу за вас? k является смещением от диагонали.

2. К вашему сведению: Взгляните на scipy.spatial.distance.squareform .

Ответ №1:

Решение: Используйте аргумент смещения k по диагонали np.triu_indices()

 import numpy as np
import pandas as pd

A = np.array([[0,1,2,3],
              [1,0,1,0],
              [2,1,0,0],
              [3,0,0,0]],
             dtype=float)

iu = np.triu_indices(len(A),k=1)
A[iu]
 

Результаты в

 array([1, 2, 3, 1, 0, 0])