如何用Python读取Fortran生成的含重复值压缩语法的一维数组文件
解决Fortran格式重复值ASCII数据转numpy一维数组的问题
问题分析
Fortran输出的ASCII数据用N*VALUE格式表示重复N次对应数值,而numpy.loadtxt()默认无法识别这种语法,直接读取会报错或生成错误结果,因此需要先对数据做预处理,将重复项展开为单个数值后再转换为numpy数组。
解决方案
方法1:直接展开为列表再转数组
适合数据量中等的场景,代码简洁直观:
import numpy as np # 读取文件内容 with open('data.txt', 'r') as f: content = f.read().strip() # 将内容按空格分割为各个重复项 repeat_items = content.split() # 展开所有重复项 expanded_values = [] for item in repeat_items: if '*' in item: # 拆分重复次数和对应数值 count_str, value_str = item.split('*') count = int(count_str) value = float(value_str) # 重复添加对应数值 expanded_values.extend([value] * count) else: # 处理无*的单个数值 expanded_values.append(float(item)) # 转换为numpy一维数组 result_array = np.array(expanded_values)
方法2:使用生成器节省内存
如果数据量极大,直接生成列表会占用过多内存,可使用生成器逐步生成数值,再通过numpy.fromiter()创建数组:
import numpy as np def expand_data(items): for item in items: if '*' in item: count_str, value_str = item.split('*') count = int(count_str) value = float(value_str) # 逐个生成重复的数值 for _ in range(count): yield value else: yield float(item) # 读取并处理数据 with open('data.txt', 'r') as f: content = f.read().strip() repeat_items = content.split() # 从生成器创建numpy数组 result_array = np.fromiter(expand_data(repeat_items), dtype=np.float64)
验证示例
针对你提供的示例数据:2*0.652384 314*0.652383 62*0.652382 48*0.652383 26*0.652384 111*0.652383,处理后得到的数组长度为2+314+62+48+26+111=563,可通过len(result_array)或result_array.shape验证结果。
内容的提问来源于stack exchange,提问作者Bruno F
相关产品推荐
相关产品推荐

