Scipy sparse.kron给出非稀疏矩阵

时间:2019-03-30 05:33:04

标签: python-3.x scipy sparse-matrix

使用Scipy稀疏模块的kron方法时,我得到了意外的非稀疏结果。具体来说,执行kronecker乘积后等于零的矩阵元素将保留在结果中,我想了解应该怎么做才能确保输出仍然完全稀疏。

这是我的意思的一个例子,以身份的两个副本的克罗内克乘积为准:

DROP TABLE IF EXISTS #CalendarMain
SELECT cast('20190101' as datetime) as DT
INTO #CalendarMain
UNION ALL SELECT '20190102' as DT
UNION ALL SELECT '20190103' as DT
UNION ALL SELECT '20190104' as DT
UNION ALL SELECT '20190105' as DT  --etc etc
;

     DROP TABLE IF EXISTS #Pattern
   SELECT cast('1'as int)                         as PatternID
          ,cast('20190101 13:00' as datetime)     as PatternDate
     INTO #Pattern
UNION ALL SELECT 2,'20190101 14:00'
UNION ALL SELECT 3,'20190101 15:00'
UNION ALL SELECT 4,'20190104 11:00'
UNION ALL SELECT 5,'20190104 14:00'
;

     DROP TABLE IF EXISTS #Result
   SELECT cast(100 as int)                as ResultID
          ,cast(1 as int)                 as PatternID
          ,cast(7 as int)                 as [Type]
     INTO #Result
UNION ALL SELECT 101,1,7
UNION ALL SELECT 102,1,8
UNION ALL SELECT 103,1,9
UNION ALL SELECT 104,2,8
UNION ALL SELECT 105,2,7
UNION ALL SELECT 106,3,7
UNION ALL SELECT 107,3,8
UNION ALL SELECT 108,4,7
UNION ALL SELECT 109,5,7
UNION ALL SELECT 110,5,8
;

     DROP TABLE IF EXISTS #Detail
   SELECT cast(201 as int)                as DetailID
          ,cast(1 as int)                 as PatternID
          ,cast(501 as int)               as Panel
     INTO #Detail
UNION ALL SELECT 202,1,502
UNION ALL SELECT 203,1,503
UNION ALL SELECT 204,1,502
UNION ALL SELECT 205,1,502
UNION ALL SELECT 206,1,502
UNION ALL SELECT 207,2,502
UNION ALL SELECT 208,2,503
UNION ALL SELECT 209,2,502
UNION ALL SELECT 210,4,502
UNION ALL SELECT 211,4,501
;
       -- create some variables 
  DECLARE @start_date as date = '20190101';
  DECLARE @end_date   as date = '20190201'; --I assume this is an exclusive end date

   SELECT cal.DT
          ,isnull(patterns.[count],0) as [Count]
     FROM #CalendarMain cal
          LEFT JOIN (   SELECT cast(p.PatternDate as date)  as PatternDate
                               ,COUNT(DISTINCT p.PatternID) as [Count]
                          FROM #Pattern     p
                               JOIN #Result r ON p.PatternID = r.PatternID
                               JOIN #Detail d ON p.PatternID = d.PatternID
                         WHERE r.[Type] = 7
                               and d.Panel = 501
                      GROUP BY cast(p.PatternDate as date)
                    ) patterns ON cal.DT = patterns.patternDate
    WHERE cal.DT >= @start_date
          and cal.DT < @end_date  --Your code would have included 1 Feb, which I assume was unintentional.
 ORDER BY cal.DT
;

稀疏矩阵S应该只包含4个(对角线)非零条目,但是在这里它还具有等于零的其他条目。任何关于我做错事情的指示将不胜感激。

1 个答案:

答案 0 :(得分:1)

Converting from sparse to dense to sparse again decreases density after constructing sparse matrix

我指出,sparse.kron在默认情况下会生成BSR格式矩阵。这就是您的显示内容。这些额外的零是密集块的一部分。

如果您指定其他格式,kron将不会产生那些零:

In [672]: sparse.kron(s,s,format='csr')                                         
Out[672]: 
<4x4 sparse matrix of type '<class 'numpy.float64'>'
    with 4 stored elements in Compressed Sparse Row format>
In [673]: _.A                                                                   
Out[673]: 
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])
相关问题