У меня есть список столбцов и значений для верхнего треугольника матрицы, я хотел бы преобразовать это в симметричную матрицу. Например, у меня есть
UpperTriangle = [[[0, 5], [6.0, 4.0]],
[[1, 3], [9.0, 6.0]],
[[2, 4, 6], [9.0, 6.0, 6.0]],
[[3], [4.0]],
[[4, 6], [4.0, 4.0]],
[[5], [2.6666666666666665]],
[[6], [4.0]]]
И я хотел бы преобразовать его в
Symmetric = [[[0, 5], [6.0, 4.0]],
[[1, 3], [9.0, 6.0]],
[[2, 4, 6], [9.0, 6.0, 6.0]],
[[1, 3], [6.0, 4.0]],
[[2, 4, 6], [6.0, 4.0, 4.0]],
[[0, 5], [4.0, 2.6666666666666665]],
[[2, 4, 6], [6.0, 4.0, 4.0]]]
Первый список относится к первой строке матрицы, первый список в списке содержит индексы столбцов, а второй список дает значения, относящиеся к индексам столбцов. Второй список относится ко второму ряду и так далее. В приведенном выше примере (строка = 0, столбец = 0) имеет значение 6,0, (строка = 0, столбец = 5) имеет значение 4,0, (строка = 1, столбец = 1) имеет значение 9,0, (строка = 1, столбец = 3) имеет значение 6.0.
Один из способов сделать это - создать пустую матрицу, а затем использовать следующую для создания симметричной матрицы.
W = np.maximum( A, A.transpose() )
Но это невыполнимо, потому что реальная проблема связана с матрицей с 350 000 строк и столбцов, построение простой матрицы A занимает слишком много памяти, а ее преобразование занимает слишком много времени.
Каким был бы самый быстрый способ Python преобразовать UpperTriangle в Symmetric, не прибегая к созданию простой матрицы (используя Python 2.7)? (в разумных пределах памяти).
Проблема возникла в связи с использованием IBM Cplex Python API, где вам нужно вставить симметричную матрицу для задания квадратичного.
import cplex
my_prob = cplex.Cplex()
my_prob.objective.set_quadratic(Symmetric)
my_prob.solve()