gpt4 book ai didi

python - 对 scipy.sparse.csr_matrix 中的行求和

转载 作者:行者123 更新时间:2023-11-28 21:51:43 24 4
gpt4 key购买 nike

我有一个很大的 csr_matrix,我想添加行并获得一个具有相同列数但行数减少的新 csr_matrix。 (上下文:矩阵是从 sklearn CountVectorizer 得到的文档术语矩阵,我希望能够根据与这些文档关联的代码快速组合文档)

举个最简单的例子,这是我的矩阵:

import numpy as np
from scipy.sparse import csr_matrix
from scipy.sparse import vstack

row = np.array([0, 4, 1, 3, 2])
col = np.array([0, 2, 2, 0, 1])
dat = np.array([1, 2, 3, 4, 5])
A = csr_matrix((dat, (row, col)), shape=(5, 5))
print A.toarray()

[[1 0 0 0 0]
[0 0 3 0 0]
[0 5 0 0 0]
[4 0 0 0 0]
[0 0 2 0 0]]

不,假设我想要一个新矩阵 B,其中行 (1, 4) 和 (2, 3, 5) 通过对它们求和来组合,看起来像这样:

[[5 0 0 0 0]
[0 5 5 0 0]]

并且应该再次采用稀疏格式(因为我正在处理的真实数据很大)。我尝试对矩阵的切片求和,然后将其堆叠:

idx1 = [1, 4]
idx2 = [2, 3, 5]
A_sub1 = A[idx1, :].sum(axis=1)
A_sub2 = A[idx2, :].sum(axis=1)
B = vstack((A_sub1, A_sub2))

但这只为切片中的非零列提供了总和值,因此我无法将它与其他切片组合,因为求和切片中的列数不同。

我觉得一定有一种简单的方法可以做到这一点。但我无法在网上或文档中找到对此的任何讨论。我错过了什么?

谢谢你的帮助

最佳答案

请注意,您可以通过仔细构造另一个矩阵来做到这一点。以下是它如何适用于密集矩阵:

>>> S = np.array([[1, 0, 0, 1, 0,], [0, 1, 1, 0, 1]])
>>> np.dot(S, A.toarray())
array([[5, 0, 0, 0, 0],
[0, 5, 5, 0, 0]])
>>>

稀疏版本只是稍微复杂一点。有关应将哪些行加在一起的信息编码在 row 中:

col = range(5)
row = [0, 1, 1, 0, 1]
dat = [1, 1, 1, 1, 1]
S = csr_matrix((dat, (row, col)), shape=(2, 5))
result = S * A
# check that the result is another sparse matrix
print type(result)
# check that the values are the ones we want
print result.toarray()

输出:

<class 'scipy.sparse.csr.csr_matrix'>
[[5 0 0 0 0]
[0 5 5 0 0]]

您可以通过在 row 中包含更高的值并相应地扩展 S 的形状来处理输出中的更多行。

关于python - 对 scipy.sparse.csr_matrix 中的行求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29629821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com