首页 > 解决方案 > 稀疏矩阵python上的元素除法

问题描述

我有一个大小为(nxm)的稀疏矩阵:

sparse_dtm = dok_matrix((num_documents, vocabulary_size), dtype=np.float32)
        for doc_index, document in enumerate(data):
            document_counter = Counter(document)
            for word in set(document):
                sparse_dtm[doc_index, word_to_index[word]] = document_counter[word]

在哪里:

另外,我有一个长度列表n

sums = sparse_dtm.sum(1).tolist()

现在,我想做一个元素划分,其中 in 的每个单元row_isparse_dtm除以sums[i].

一种天真的方法,使用传统的 Python 元素划分:

sparse_dtm / sums

导致以下错误:

TypeError: unsupported operand type(s) for /: 'csr_matrix' and 'list'

我怎样才能执行这种逐元素划分?

标签: python-3.xscipysparse-matrixelementwise-operations

解决方案


如果我理解正确,您需要将每一行除以行的总和,对吗?

在这种情况下,您需要重新调整总和

sparse_dtm / sparse_dtm.sum(1).reshape(-1, 1)

例如,您也可以使用 pandas DataFrame 来执行此操作

row_num = 10
col_num = 5
sparse_dtm = np.ndarray((row_num, col_num), dtype=np.float32)
for row in range(row_num):
    for col in range(col_num):
        value = (row+1) * (col+2)
        sparse_dtm[row, col] = value
df = pd.DataFrame(sparse_dtm)
print(df)

      0     1     2     3     4
0   2.0   3.0   4.0   5.0   6.0
1   4.0   6.0   8.0  10.0  12.0
2   6.0   9.0  12.0  15.0  18.0
3   8.0  12.0  16.0  20.0  24.0
4  10.0  15.0  20.0  25.0  30.0
5  12.0  18.0  24.0  30.0  36.0
6  14.0  21.0  28.0  35.0  42.0
7  16.0  24.0  32.0  40.0  48.0
8  18.0  27.0  36.0  45.0  54.0
9  20.0  30.0  40.0  50.0  60.0

然后将每一行除以行的总和

df / df.sum(axis=1).values.reshape(-1, 1)

这给了

     0     1    2     3    4
0  0.1  0.15  0.2  0.25  0.3
1  0.1  0.15  0.2  0.25  0.3
2  0.1  0.15  0.2  0.25  0.3
3  0.1  0.15  0.2  0.25  0.3
4  0.1  0.15  0.2  0.25  0.3
5  0.1  0.15  0.2  0.25  0.3
6  0.1  0.15  0.2  0.25  0.3
7  0.1  0.15  0.2  0.25  0.3
8  0.1  0.15  0.2  0.25  0.3
9  0.1  0.15  0.2  0.25  0.3

推荐阅读