python-3.x - 稀疏矩阵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]
在哪里:
- num_documents = n
- 词汇大小 = 米
- 数据 = 标记化列表的列表
另外,我有一个长度列表n
:
sums = sparse_dtm.sum(1).tolist()
现在,我想做一个元素划分,其中 in 的每个单元row_i
格sparse_dtm
除以sums[i]
.
一种天真的方法,使用传统的 Python 元素划分:
sparse_dtm / sums
导致以下错误:
TypeError: unsupported operand type(s) for /: 'csr_matrix' and 'list'
我怎样才能执行这种逐元素划分?
解决方案
如果我理解正确,您需要将每一行除以行的总和,对吗?
在这种情况下,您需要重新调整总和
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
推荐阅读
- r - 映射来自 2 个列表的变量并将它们存储在单独的数据框中
- dataframe - Julia Dataframe 中的特定案例
- javascript - 过滤graphql-js中的子字段
- botframework - provisionCOMposer.js 返回“错误主机名”的错误消息
- python - Pandas 无法将数据导入 MySQL 数据库,列中有括号
- java - Kotlin/Mockito:如何从 kotlin.Annotation 模拟“annotationClass”
- tensorflow - 如何训练 CNN 从标记的图像中学习边界框?
- vue.js - nuxt.config.js 在哪里构建模块仅在开发模式下构建?
- r - 如何将使用 with(plot()) 绘制的绘图保存到 R 中的变量中?
- r - 使用 full_join 合并两个以上数据帧时的后缀