如何从含索引与值的TXT文件生成scipy稀疏矩阵或numpy数组
实现方案
直接基于现有TXT结构生成目标数据结构的实现非常简单,不需要调整现有文件格式,以下是两种常用场景的代码实现:
方案1:生成scipy稀疏矩阵(适合大矩阵,内存占用低)
scipy的coo_matrix原生支持「行索引、列索引、对应值」的三元组输入,完全匹配你的TXT文件结构,未指定位置默认值为0,刚好符合需求。
代码示例
import numpy as np from scipy.sparse import coo_matrix # 第一步:读取TXT文件的三元组数据,直接按列拆分 data = np.loadtxt("你的文件路径.txt") row = data[:, 0].astype(int) # x轴索引(行索引)转整数 col = data[:, 1].astype(int) # y轴索引(列索引)转整数 val = data[:, 2] # 矩阵对应位置数值 # 第二步:生成COO格式稀疏矩阵 # 如果你已知矩阵的行列数,可以手动指定shape参数,比如shape=(5,5)代表5行5列的矩阵 # 不指定shape的话会自动取行/列索引的最大值+1作为矩阵的对应维度 sparse_mat = coo_matrix((val, (row, col))) # 如果需要转成其他稀疏格式(比如csr用于快速运算),直接调用对应方法即可 csr_mat = sparse_mat.tocsr()
方案2:生成numpy稠密数组
如果矩阵规模小,需要直接得到稠密numpy数组,可以在上述代码基础上直接调用toarray()方法:
# 接上面读取row、col、val的代码 dense_mat = coo_matrix((val, (row, col))).toarray() # 也可以手动初始化全0数组后赋值,适合需要自定义矩阵大小的场景 # 比如你需要生成10行10列的矩阵: # dense_mat = np.zeros((10, 10)) # dense_mat[row, col] = val
示例验证
用你给出的示例文件内容运行上述代码,得到的数组结果如下:
[[4. 5.2 2.1] [2.1 2.9 3.1]]
完全符合预期。
内容的提问来源于stack exchange,提问作者12213119
相关产品推荐
相关产品推荐

