You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:22:13