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

按固定字符数分割无空格2D数组遇ValueError问题求助

解决方案

1. 先按固定宽度分割每行

原始数据是无空格的单行文本,需按每7个字符分割成88列,先读取所有行并完成切片:

import numpy as np

# 读取文件并去除每行的换行符
with open('你的数据文件.txt', 'r') as f:
    lines = [line.strip() for line in f]

# 按每7个字符分割每行,取前88段确保列数正确
split_rows = []
for line in lines:
    row = [line[i:i+7].strip() for i in range(0, 7*88, 7)]
    split_rows.append(row)

2. 处理星号与数值转换

星号无法直接转为浮点数,将其替换为numpy缺失值NaN,同时清理数值字符串中的空格、冗余小数点后转为浮点数:

processed_data = []
for row in split_rows:
    processed_row = []
    for item in row:
        if '*' in item:
            processed_row.append(np.nan)
        else:
            # 只保留数字和小数点,避免空格干扰
            cleaned_str = ''.join([c for c in item if c.isdigit() or c == '.'])
            processed_row.append(float(cleaned_str) if cleaned_str else np.nan)
    processed_data.append(processed_row)

# 转为最终的numpy数组
final_array = np.array(processed_data, dtype=np.float64)
# 验证形状是否为(148, 88)
print(final_array.shape)

3. 简化方案:用numpy.genfromtxt直接处理

利用genfromtxt的固定宽度分割和缺失值处理能力,一步完成读取与转换:

final_array = np.genfromtxt(
    '你的数据文件.txt',
    delimiter=[7]*88,  # 指定每列宽度为7
    dtype=np.float64,
    missing_values='*',  # 将星号标记为缺失值
    filling_values=np.nan,
    # 自定义转换器:清理非数字字符后转浮点数
    converters={i: lambda s: float(''.join([c for c in s.decode() if c.isdigit() or c == '.'])) if '*' not in s.decode() else np.nan for i in range(88)}
)

为什么loadtxt会报错?

loadtxt不支持固定宽度的文本分割,且没有内置的缺失值处理逻辑,遇到星号这类非数值字符串时会直接抛出ValueError,因此更适合用genfromtxt或手动预处理后再转换。

内容的提问来源于stack exchange,提问作者DAL1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:58:10