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

如何将稀疏矩阵中第一列的行和其他列的零相加,使原始矩阵的维数相同?

  •  0
  • Bilal  · 技术社区  · 6 年前

    我有一个稀疏矩阵B,我想通过求第一列中所有行的和,然后将第一列除以'2',并使其他列为零,从B得到稀疏矩阵a。

    from numpy import array
    from scipy import csr_matrix
    
    row = array([0,0,1,2,2,2])
    col = array([0,2,2,0,1,2])
    data = array([1,2,3,4,5,6])
    
    B = csr_matrix( (data,(row,col)), shape=(3,3) )
    
    A = B.copy()
    
    A = A.sum(axis=1)/2
    # A shape becomes 1 x 3 instead of 3 x 3 here!
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   hpaulj    6 年前

    我认为这可以通过几种方式来实现。你的孩子很好。

    In [275]: from scipy.sparse import csr_matrix 
         ...:  
         ...: row = np.array([0,0,1,2,2,2]) 
         ...: col = np.array([0,2,2,0,1,2]) 
         ...: data = np.array([1,2,3,4,5,6.])    # make float 
         ...:  
         ...: B = csr_matrix( (data,(row,col)), shape=(3,3) )                                              
    In [276]: A = B.copy()                                                                                 
    In [277]: A                                                                                            
    Out[277]: 
    <3x3 sparse matrix of type '<class 'numpy.float64'>'
        with 6 stored elements in Compressed Sparse Row format>
    

    任务是:

    In [278]: A[:,0]  = A.sum(axis=1)/2                                                                    
    /usr/local/lib/python3.6/dist-packages/scipy/sparse/_index.py:126: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
      self._set_arrayXarray(i, j, x)
    In [279]: A[:,1:] = 0                                                                                  
    /usr/local/lib/python3.6/dist-packages/scipy/sparse/_index.py:126: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
      self._set_arrayXarray(i, j, x)
    In [280]: A                                                                                            
    Out[280]: 
    <3x3 sparse matrix of type '<class 'numpy.float64'>'
        with 9 stored elements in Compressed Sparse Row format>
    
    In [283]: A.eliminate_zeros()                                                                          
    In [284]: A                                                                                            
    Out[284]: 
    <3x3 sparse matrix of type '<class 'numpy.float64'>'
        with 3 stored elements in Compressed Sparse Row format>
    In [285]: A.A                                                                                          
    Out[285]: 
    array([[1.5, 0. , 0. ],
           [1.5, 0. , 0. ],
           [7.5, 0. , 0. ]])
    

    或者我们从零开始 A

    In [286]: A = csr_matrix(np.zeros(B.shape))   # may be better method                                                         
    In [287]: A[:,0]  = B.sum(axis=1)/2                                                                    
    /usr/local/lib/python3.6/dist-packages/scipy/sparse/_index.py:126: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
      self._set_arrayXarray(i, j, x)
    In [288]: A                                                                                            
    Out[288]: 
    <3x3 sparse matrix of type '<class 'numpy.float64'>'
        with 3 stored elements in Compressed Sparse Row format>
    

    或者,可以使用列和矩阵来构造 A 直接使用与用于定义 B :

    In [289]: A1  = B.sum(axis=1)/2                                                                        
    In [290]: A1                                                                                           
    Out[290]: 
    matrix([[1.5],
            [1.5],
            [7.5]])
    In [296]: row = np.arange(3)                                                                           
    In [297]: col = np.zeros(3,int)                                                                        
    In [298]: data = A1.A1                                                                                 
    In [299]: A = csr_matrix((data, (row, col)), shape=(3,3))                                              
    In [301]: A                                                                                            
    Out[301]: 
    <3x3 sparse matrix of type '<class 'numpy.float64'>'
        with 3 stored elements in Compressed Sparse Row format>
    In [302]: A.A                                                                                          
    Out[302]: 
    array([[1.5, 0. , 0. ],
           [1.5, 0. , 0. ],
           [7.5, 0. , 0. ]])
    

    sparse.hstack 看起来不错,不过在被子里, hstack 正在构建 row,col,data coo 格式,并制作一个新的 coo_matrix . 虽然它是可靠的,但并不是特别精简。

        2
  •  0
  •   Bilal    6 年前

    from numpy import array
    from scipy import csr_matrix
    
    row = array([0,0,1,2,2,2])
    col = array([0,2,2,0,1,2])
    data = array([1,2,3,4,5,6])
    
    B = csr_matrix( (data,(row,col)), shape=(3,3) )
    
    B_C = B.copy()
    column1 = B_C.sum(axis=1)/2
    #------------------------------------------------
    columns = csr_matrix((B.shape[0],B.shape[1]-1))
    A = sparse.hstack((column1 , columns ))
    #------------------------------------------------