NumPy savetxt存储含字符串列数据时触发dtype与格式说明符不匹配错误咨询
报错根源
把Python原生zip()生成的混合类型迭代器直接传给np.savetxt时,NumPy无法识别跨列的浮点、字符串混合类型,会将整个迭代器强制转为统一的一维字节字符串数组(即报错提示的|S32类型),和传入的多列格式化规则完全匹配不上。
可落地解决方法
方法1:构造结构化数组后保存(兼容原有格式化规则)
不要直接传zip迭代器,先按每列的实际数据类型定义结构化NumPy数组,再调用savetxt,你之前写的格式化串可以完全复用:
# 匹配每列实际数据类型的定义 col_dtype = [ ('lat', np.float64), ('lon', np.float64), ('time_unix', np.float64), ('hr_time', np.str_, 32) ] # 按列组合所有数据为结构化数据集 data = np.rec.fromarrays([lat, lon, time_unix, hr_time], dtype=col_dtype) # 原有格式化规则可直接使用 np.savetxt("shadow_orbit.dat", data, fmt='%.7f %.7f %.7f %s')
方法2:逐行拼接写文件(无类型推断陷阱)
如果不需要处理NumPy的结构化数组逻辑,直接绕开savetxt的类型推断流程,逐行拼接目标格式的字符串写入文件,完全不会触发类型不匹配报错:
with open("shadow_orbit.dat", "w", encoding="utf-8") as f: for lat_val, lon_val, unix_val, hr_val in zip(lat, lon, time_unix, hr_time): line = f"{lat_val:.7f} {lon_val:.7f} {unix_val:.7f} {hr_val}" f.write(f"{line}\n")
额外提示
如果只需要存3个浮点列满足基础需求,直接把zip迭代器传给savetxt依然会触发同样的类型转换报错,同样适用以上两种修正方式,不需要单独调整逻辑。
内容的提问来源于stack exchange,提问作者Gipsy
相关产品推荐
相关产品推荐

