Создание симметричных матричных индексов-значений в Python - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть список столбцов и значений для верхнего треугольника матрицы, я хотел бы преобразовать это в симметричную матрицу. Например, у меня есть

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()

1 Ответ

0 голосов
/ 18 сентября 2018

Представление ввода CSR здесь очень удобно.Рассматривая каждую строку, вы, конечно, узнаете о столбце симметричной матрицы.Когда вы достигнете каждой строки, вы уже узнаете содержимое всех столбцов, опущенных в его верхней треугольной форме.Вы даже узнаете об этих значениях в порядке их появления в этой строке!

Это просто вопрос программирования:

def sym(up):        # alters 'up' in place
  pfx=[([],[]) for _ in up]  # to be added to each row
  for r,((cc,vv),(pc,pv)) in enumerate(zip(up,pfx)):
    for c,v in zip(cc,vv):
      if c>r:       # store off-diagonal for later row
        cr,cv=pfx[c]
        cr.append(r); cv.append(v)
    cc[:0]=pc; vv[:0]=pv     # prepend to preserve order
...