gab*_*abe 5 python numpy scipy sparse-matrix
我有一个稀疏矩阵,我通过一系列复杂的计算得出,我无法在这里重现.我将尝试找到一个更简单的例子.
目前,有没有人知道如何(甚至远程)可能有一个稀疏矩阵X,其属性为:
In [143]: X.sum(0).sum()
Out[143]: 131138
In [144]: X.sum()
Out[144]: 327746
In [145]: X.sum(1).sum()
Out[145]: 327746
In [146]: type(X)
Out[146]: scipy.sparse.csr.csr_matrix
Run Code Online (Sandbox Code Playgroud)
我唯一的猜测是,如果我想正确地对列进行求和,我需要首先将矩阵转换为csc - 这是有道理的.虽然人们会认为稀疏包可以优雅地处理列总和(或抛出错误)而不是仅仅给出错误的答案.
经过深思熟虑后,我尝试了以下方法:
In [164]: X.tocsr().sum(0).sum()
Out[164]: 131138
In [165]: X.tocsc().sum(0).sum()
Out[165]: 131138
In [166]: X.tocoo().sum(0).sum()
Out[166]: 131138
In [167]: X.tolil().sum(0).sum()
Out[167]: 131138
In [168]: X.todok().sum(0).sum()
Out[168]: 131138
In [169]: X.shape
Out[169]: (196980, 43)
In [170]: X
Out[170]:
<196980x43 sparse matrix of type '<type 'numpy.uint16'>'
with 70875 stored elements in Compressed Sparse Row format>
In [172]: X.todense().sum(0)
Out[172]:
matrix([[170726, 1041, 117398, 3526, 13202, 3585, 2355, 1895, 1392, 2189, 2070, 2603, 1676, 496, 1194, 933, 129,
529, 544, 256, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint64)
In [173]: X.sum(0)
Out[173]:
matrix([[39654, 1041, 51862, 3526, 13202, 3585, 2355, 1895, 1392, 2189, 2070, 2603, 1676, 496, 1194, 933, 129, 529, 544, 256,
7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0]], dtype=uint16)
Run Code Online (Sandbox Code Playgroud)
我应该添加一些更多的上下文:矩阵只有非负的条目(它们是计数).特别是有两个稀疏计数矩阵A和B我一起相乘得到X.
好的,所以塞伯格回答了这个问题。多谢。去塞伯格吧!
他观察到数据类型 uint16 可能是一个问题。果然,uint16 的最大值约为 65,000,我的总和比这个大得多,尽管我的个人数据点比这个小得多。
布丁中的证据:
In [184]: Y = sparse.csc_matrix(X,dtype=np.uint32)
In [185]: Y.sum(0).sum()
Out[185]: 327746
In [187]: Y.sum(0)
Out[187]:
matrix([[170726, 1041, 117398, 3526, 13202, 3585, 2355, 1895, 1392, 2189, 2070, 2603, 1676, 496, 1194, 933, 129,
529, 544, 256, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint32)
Run Code Online (Sandbox Code Playgroud)
这解释了不一致的总和,并通过更改数据类型来纠正问题。尽管如此,仍然存在一个持续存在的问题——如果我有一个包含所有小条目的矩阵,我希望能够为其使用较小的数据类型(以节省内存)。
这是一个单独但相关的问题:
对稀疏矩阵的列求和时,有没有一种方法可以优雅地处理数值溢出问题?