有效地改变scipy.spare.csr_matrix的维度

时间:2015-06-07 07:32:17

标签: python python-2.7 numpy scipy sparse-matrix

我有一个函数需要csr_matrix并对其进行一些计算。

这些计算的行为要求此矩阵的形状是特定的(比如NxM)。

我发送的输入具有较少的列和确切的行数。

(例如,它具有形状=(A,B),其中A< N和B == M)

例如:我有对象x

>>>x = csr_matrix([[1,2],[1,2]])
>>>x
(0, 0)  1
(0, 1)  2
(1, 0)  1
(1, 1)  2
>>>x.shape
(2, 2)

功能f

def f(csr_mat):
    """csr_mat.shape should be (2,3)"""

然后我想在x上做一些事情,所以它会变成y

>>>y = csr_matrix([[1,2,0],[1,2,0]])
>>>y
(0, 0)  1
(0, 1)  2
(1, 0)  1
(1, 1)  2
>>>y.shape
(2, 3)

在此示例中,xy具有相同的非零值,但y具有不同的形状。我想要的是有效地“扩展”x到一个新的维度,用零填充新的列。即,给定xnew_shape=(2,3),它应该返回y 我已经尝试了reshape

x.reshape((2,3))

但后来我得到了:

  

NotImplementedError

我的第二个选择就是创建具有不同形状的新csr_matrix

z = csr_matrix(x,shape=(3,3))

但这也失败了:

  

NotImplementedError:没有为csr_matrix实现重塑。

编辑:使用csc_matrix带来了同样的错误。

任何想法?

由于

1 个答案:

答案 0 :(得分:7)

在CSR格式中,所需data的基础indicesindptry数组与x矩阵的数组相同。您可以使用新的csr_matrix

将这些内容传递给shape构造函数
y = csr_matrix((x.data, x.indices, x.indptr), shape=(2, 3))

请注意,构造函数默认为copy=False,因此这将在dataindices之间共享indptrxyy上的某些操作将反映在x中。您可以通过copy=True使xy相互独立。

如果您想查看csr_matrix的未记录内部,可以设置内部_shape属性,使x数组具有您想要的形状:

x._shape = (2, 3)

这样做并没有什么优势。