按固定字符数分割无空格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
相关产品推荐
相关产品推荐

