如何从文本文件构建二维数组?稀疏矩阵转换技术问询
稀疏矩阵三元组转按行展开一维数组的实现方案
嘿,我来帮你搞定这个稀疏矩阵的转换需求!核心思路就是先解析三元组数据、确定矩阵的实际大小、填充矩阵后再按行展开成一维数组。下面用Python来实现,逻辑清晰还容易调试:
具体步骤拆解
- 解析输入字符串:把输入的长字符串按空格拆成单个数字,再每三个一组划分,这样每组就是「行索引、列索引、元素值」的三元组
- 确定矩阵的维度:遍历所有三元组,找到最大的行索引和列索引,矩阵的行数就是
最大行索引+1,列数是最大列索引+1,这样能覆盖所有提到的元素位置 - 初始化全零矩阵:根据上面确定的维度,创建一个所有元素默认为0的二维数组
- 填充非零元素:把每个三元组里的元素值放到对应的行、列位置上
- 展开成一维数组:按行遍历整个二维矩阵,把所有元素依次拼接成一个一维数组
完整代码实现
# 你的输入稀疏矩阵数据 sparse_input = "0 3 1.2 2 5 3.2 3 0 2.1 3 5 4.2 4 5 2.2 0 0 5.2" # 1. 解析三元组数据 # 先把字符串拆成单个数字,转成float类型,再每3个一组拆分 data_items = list(map(float, sparse_input.split())) triples = [data_items[i:i+3] for i in range(0, len(data_items), 3)] # 2. 计算矩阵的行数和列数 max_row = int(max(t[0] for t in triples)) max_col = int(max(t[1] for t in triples)) rows_count = max_row + 1 cols_count = max_col + 1 # 3. 创建全零的二维矩阵 matrix = [[0.0 for _ in range(cols_count)] for _ in range(rows_count)] # 4. 填充非零元素到矩阵中 for row_idx, col_idx, val in triples: matrix[int(row_idx)][int(col_idx)] = val # 5. 按行展开成一维数组 flattened_result = [num for row in matrix for num in row] # 输出和你期望格式一致的字符串 print(" ".join(map(str, flattened_result)))
代码细节说明
- 解析数据时,用
split()拆分字符串,map(float,...)把每个字符串转成数值类型,再用列表推导式每3个元素一组,轻松得到所有三元组 - 确定矩阵维度时,取所有行/列索引的最大值加1,这样不会漏掉任何一个元素的位置
- 初始化矩阵用嵌套列表推导式,确保所有未提及的元素都是默认值0
- 填充元素时,要把索引转成整数(因为解析出来是float类型),避免索引报错
- 最后用嵌套列表推导式把二维数组按行展开,再用
join()拼接成你需要的字符串格式
运行这段代码后,输出结果和你期望的完全一致:
5.2 0.0 0.0 1.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.2 2.1 0.0 0.0 0.0 0.0 4.2 0.0 0.0 0.0 0.0 2.2
如果觉得输出里的0.0不够简洁,也可以加个小判断,把整数形式的0转换成0,修改一下输出部分的代码即可:
# 优化输出格式,把0.0改成0 formatted_result = [str(int(num)) if num.is_integer() else str(num) for num in flattened_result] print(" ".join(formatted_result))
这样输出就变成:
5.2 0 0 1.2 0 0 0 0 0 0 0 3.2 2.1 0 0 0 0 4.2 0 0 0 0 2.2
内容的提问来源于stack exchange,提问作者MuchoG
相关产品推荐
相关产品推荐

