代码之家  ›  专栏  ›  技术社区  ›  user58925

在Python中创建对称矩阵索引值

  •  1
  • user58925  · 技术社区  · 7 年前

    我有一个列表的列和值的上三角矩阵,我想把它转换成一个对称矩阵。例如,我有

    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。

    一种方法是创建一个numpy矩阵,然后使用下面的方法创建一个对称矩阵。

    W = np.maximum( A, A.transpose() )
    

    但这是不可行的,因为实际问题涉及到一个有350000行和列的矩阵,构建一个numpy矩阵a占用太多内存,转换它需要太多时间。

    在不构建numpy矩阵的情况下(使用python2.7),最快的Python方法是什么?(在合理的内存范围内)。

    这个问题是在使用IBM的cplexpythonapi时出现的,您需要插入一个对称矩阵来设置二次型。

    import cplex
    my_prob = cplex.Cplex()
    my_prob.objective.set_quadratic(Symmetric)
    my_prob.solve()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Davis Herring    7 年前

    这个 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