scipy中的稀疏矩阵转置

时间:2017-06-20 10:17:27

标签: python scipy sparse-matrix

我初始化了我的稀疏矩阵:

from scipy.sparse import lil_matrix
import numpy as np

X = [lil_matrix((3,3)) for i in range(2)]
X[0][0,0]=1
X[1][0,0]=1
X[1][0,1]=1

我将这个矩阵转换成这样:

elem =[a.toarray() for a in X]
elem =np.array(elem)
new_mat = np.array(elem.reshape((3,3,2)))
T = [lil_matrix(new_mat[:, :, i]) for i in range(new_mat.shape[2])]

在我的情况下,我的X稀疏矩阵非常庞大,在将X转换为T时,我遇到了内存错误。有没有一种有效的方法呢?

1 个答案:

答案 0 :(得分:1)

制作阵列(使用不同尺寸突出转置模糊度):

In [859]: X=[sparse.lil_matrix((3,4)) for i in range(2)]
In [860]: X
Out[860]: 
[<3x4 sparse matrix of type '<class 'numpy.float64'>'
    with 0 stored elements in LInked List format>,
 <3x4 sparse matrix of type '<class 'numpy.float64'>'
    with 0 stored elements in LInked List format>]
In [861]: X[0][0,0]=1
In [862]: X[1][0,0]=1
In [864]: X[1][0,1]=1

现在这个矩阵列表的原始数据是:

In [866]: X[0].rows
Out[866]: array([[0], [], []], dtype=object)
In [867]: X[0].data
Out[867]: array([[1.0], [], []], dtype=object)
In [868]: X[1].rows
Out[868]: array([[0, 1], [], []], dtype=object)
In [869]: X[1].data
Out[869]: array([[1.0, 1.0], [], []], dtype=object)

如果我从X创建一个3d数组:

In [870]: elem = np.array([a.A for a in X])
In [871]: elem
Out[871]: 
array([[[ 1.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 1.,  1.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])

这个3d的正确转置是(4,3,2)数组:

In [872]: elem.T
Out[872]: 
array([[[ 1.,  1.],
        [ 0.,  0.],
        [ 0.,  0.]],

       [[ 0.,  1.],
        [ 0.,  0.],
        [ 0.,  0.]],

       [[ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.]],

       [[ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.]]])

重塑可以完成,但往往会改变价值观:

In [873]: elem.reshape(3,4,2)
Out[873]: 
array([[[ 1.,  0.],
        [ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.]],

       [[ 0.,  0.],
        [ 0.,  0.],
        [ 1.,  1.],
        [ 0.,  0.]],

       [[ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.]]])

在任何情况下,如果X太大而elem会出现内存错误,我认为您唯一的选择是创建一个新的空X1列表(例如4个矩阵形状( 3,2)),并从原始矩阵中复制值。首先,我尝试使用上面列出的lil属性,但其他格式之一可能更方便。 sparse代码通常使用coo格式从较小的矩阵构造新矩阵(例如,查看sparse.bmat代码)。

对于非标准的东西,我怀疑是否有任何简单的库存解决方案。我们通常不会混合和匹配稀疏矩阵列表的元素。