scipy.sparse矩阵的Python线性代数运算 简言之:
我试图在稀疏矩阵上执行线性代数运算(矩阵乘法和张量积),但遇到了内存问题。scipy.sparse矩阵的Python线性代数运算 简言之:,python,scipy,linear-algebra,sparse-matrix,Python,Scipy,Linear Algebra,Sparse Matrix,我试图在稀疏矩阵上执行线性代数运算(矩阵乘法和张量积),但遇到了内存问题。 我有两个问题 关于使用CSR格式对scipy.sparse中实现的大型矩阵执行矩阵乘法(点运算)时的内存问题 第二个是(大型)稀疏矩阵的numpy.tensorproduct函数的任何实现 我还对使用其他更适合的建模软件(如Matlab)或库(如tensorflow)的建议非常感兴趣,但我想强调的是,在完成上述线性代数之后,我将需要图形算法 第一个问题,详情 我正在使用二部有向图的邻接列表(使用networkx)。 使用
我有两个问题
使用networkx.algorithms.bipartite.matrix.biadjacency_matrix,我得到了两个压缩稀疏行(CSR)格式的稀疏矩阵A、B,用scipy.sparse实现。 矩阵A和B的形状约为(1000200000),稀疏度约为0.4%(约900000条边) 但是,当尝试使用点运算将A与B的转置相乘(以获得大小为200000x200000的矩阵)时。我得到以下内存错误
Unable to allocate 2.95 GiB for an array with shape (793134830,) and data type int32
我在这篇文章中看到了类似的问题。我的问题是:如何解决这个问题 代表代码如下:
import scipy
A = scipy.sparse.random(1000,200000, density = 0.004, format = 'csr')
B = scipy.sparse.random(1000,200000, density = 0.004, format = 'csr')
temp = (A.transpose()).dot(B)
第二项质询,详情
在后面的代码中,我仍然在使用上面定义的矩阵A、B(形状大约为(1000200000),稀疏度大约为0.4%)
我试图形成这些矩阵的张量积,并用numpy得到一个对角线。
如果矩阵A和B是np.array(稠密)格式(因此不是scipy.sparse),代码如下所示
C = numpy.diagonal(numpy.tensordot(A.T,B,axes = 0), axis1 = 0, axis2 = 2))
特别是,我试图用元素C[I,j,k]=A[I,k]B[j,k]构造形状为(10001000200000)的三维张量C
当我尝试将稀疏实现用于numpy时,也会出现同样的问题,即scipy.sparse.kron(用于kronecker产品)
对于这个线性代数运算,同样的问题是:如何解决这个问题?您尝试过链接SO注释中使用的内存使用计算吗?简言之:稀疏矩阵乘法破坏稀疏性。没有什么不寻常的事情,你也无能为力。爆炸取决于稀疏模式/分布,你应该问问自己,均匀随机分布是否真的定义了你的问题(或者只是为了演示)。如果是,那么。。。除了购买更多的内存,你什么都做不了。具体问题,根据此操作的来源和用途,可能会有一些补救措施,如利用重新排序。例如,这看起来像:
dims:10 2000->稀疏性:0.00016375 | dims:100 20000->稀疏性:0.001599235 | dims:1000 200000->稀疏性:0.01587357455
。这意味着,在最后一个示例中,634942982
非零将导致存储结果的~634942982*(4+4+8字节)~10GB
。(假设scipy使用4个字节作为索引,8个字节作为值,例如double)。使用C=np.einsum('ik,jk->ijk',A,B)
可以更好地计算密集的C
。这对稀疏版本并没有帮助<带有0的code>tensordot生成一个(200000001000200000)数组,然后使用对角线删除一个维度<代码>克朗
为(200000*1000200000*1000)sparse
相对于dense节省了内存,但仍然必须为每个非零值保留内存,并为其列索引和indptr
保留内存。我们希望在人们询问错误时看到回溯,而不仅仅是一行摘要。我怀疑您的第一个错误在compressed.py
中的\u mul\u sparse\u matrix
中。它根据矩阵索引估计结果nnz
,然后创建index=np.empty(nnz,dtype=idx_dtype)
。它还必须使数据
数组具有相同的大小(但浮点
)。
scipy.sparse.kron(A.T, B)
out: MemoryError: Unable to allocate 2.67 TiB for an array with shape (735050737201,) and data type int32