说我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()
,还是有其他方法可以继续?
答案 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.]])