python - 有效改变 scipy.spare.csr_matrix 的维度

标签 python python-2.7 numpy scipy sparse-matrix

<分区>

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

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

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

(例如它有 shape=(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: Reshaping not implemented for csr_matrix.

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

有什么想法吗?

谢谢

最佳答案

在 CSR 格式中,基础 data , indices , 和 indptr您想要的阵列 y与您的 x 相同矩阵。您可以将它们传递给 csr_matrix带有新 shape 的构造函数:

y = csr_matrix((x.data, x.indices, x.indptr), shape=(2, 3))

请注意,构造函数默认为 copy=False , 所以这将共享 data , indices , 和 indptrx 之间和 y . y 上的一些操作会反射(reflect)在x .你可以通过copy=True制作xy相互独立。

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

x._shape = (2, 3)

这样做并没有真正的优势。

关于python - 有效改变 scipy.spare.csr_matrix 的维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30691160/

相关文章:

python - 高级切片 : Python lists vs Numpy arrays

python - Django Admin- 限制外键字段的选择

python - python中的导入是否被认为是动态链接?

python - 经过训练的神经网络使用相同的数据产生不同的预测(TensorFlow)

python - 不带括号的打印字典

python - pyspark 中处理大数据的优化

python-2.7 - NetworkX python : pagerank_numpy, pagerank 失败但 pagerank_scipy 有效

python - 以特定方式重新排列 3D numpy 数组

python - except 子句中的断点无权访问绑定(bind)异常

python - 用于迭代 numpy 数组列表的行的生成器