稀疏构造:重复身份

时间:2015-03-04 22:36:01

标签: python scipy

说我ij很大(例如5000),后面两个矩阵

E = np.identity((ij))
oneVector = np.ones((1, ij))

我需要计算

np.kron(E, oneVector)

这非常缓慢且效率低下。基本上,Kronecker标识的乘积和1的行向量在水平oneVector.size次重复单位矩阵。

我认为创造稀疏产品会更有意义。如果我将A,B都稀疏,那么scipy.sparse.kron将允许我创建该产品。但我不知道如何创建一个"稀疏类型"矩阵。

是否有一种简单的方法可以生成稀疏的等效np.ones(),还是有其他方法可以继续?

1 个答案:

答案 0 :(得分:1)

scipy.sparse.kron的参数不必稀疏。

In [31]: import numpy as np

In [32]: import scipy.sparse as sp

In [33]: ij = 4

In [34]: E = sp.identity(ij)  # Sparse identity matrix

In [35]: oneVector = np.ones((1, ij))  # Dense

In [36]: m = sp.kron(E, oneVector)  # m is sparse.

In [37]: m
Out[37]: 
<4x16 sparse matrix of type '<type 'numpy.float64'>'
    with 16 stored elements (blocksize = 1x4) in Block Sparse Row format>

In [38]: m.A
Out[38]: 
array([[ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  1.,  1.]])

P.S。基于此评论:

  

基本上,身份的Kronecker乘积和1的行向量是水平重复单一矩阵oneVector.size次。

我想知道你的意思是kron(oneVector, E)

In [39]: m = sp.kron(oneVector, E)

In [40]: m.A
Out[40]: 
array([[ 1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.]])