我初始化了我的稀疏矩阵:
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时,我遇到了内存错误。有没有一种有效的方法呢?
答案 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
代码)。
对于非标准的东西,我怀疑是否有任何简单的库存解决方案。我们通常不会混合和匹配稀疏矩阵列表的元素。