scipy.io.savemat保存雷达数据为mat文件报NoneType转换错误求解
错误原因
scipy.io.savemat 只能存储Matlab兼容的numpy数组、字符串、数字、基础字典/列表这类结构,你直接传入的data是雷达SDK返回的自定义采集对象,不是纯数值数组,对象内部带有不少值为None的内部属性,转换时就会触发「Could not convert None (type <class 'NoneType'>) to array」报错。
修复方法
- 第一步:从采集结果对象中提取有效原始采样数据
不要直接存储acq.read()返回的整个自定义对象,SENSE X1系列雷达SDK自带转numpy数组的方法,读取数据后先转换为纯数值数组:import numpy as np from scipy import io # 保留原有采集读取逻辑 data = acq.read() # 提取原始ADC采样数组,若方法名不匹配可执行print(dir(data))查看对象所有属性/方法,查找带samples、ndarray关键字的有效字段 raw_adc_data = data.as_ndarray() # 本地校验数据有效性 print(f"数据维度:{raw_adc_data.shape}, 数据类型:{raw_adc_data.dtype}, 空值数量:{np.sum(np.isnan(raw_adc_data))}") - 第二步:整理待存储字典,仅传入基础类型与numpy数组
配置项也不要直接存储整个config对象,把跑SAR算法需要的参数单独提取出来,确保所有值都是数字、字符串、numpy数组这类savemat支持的类型:save_dict = { "radar_data": raw_adc_data, "cfg_start_freq": config["sweep"]["start_frequency"], "cfg_stop_freq": config["sweep"]["stop_frequency"], "cfg_sample_num": config["sweep"]["num_samples"], "cfg_sweep_count": config["sweep"]["count"] } # 写入mat文件,开启压缩可大幅减小文件体积 io.savemat("test.mat", save_dict, do_compression=True) - 第三步:存储结果校验
写入完成后用io.loadmat("test.mat")读回文件,确认所有字段完整、数值无异常,再放到Matlab环境中运行SAR算法即可。
避坑提示
- 所有传入
savemat的内容都不能是自定义类实例、文件句柄、日志对象这类特殊类型,必须转换为基础类型或者numpy数组 - 若转换数组时仍发现存在None/空值,优先检查采集流程:确认雷达完成完整扫频动作后再读取数据,必要时可在
acq = device.initiate.immediate_and_receive()后添加数百毫秒延时,等待采集完成再调用read() - 若当前使用的SDK版本没有
as_ndarray()方法,可直接访问data.samples属性取原始采样值,再调用np.array()转换为numpy数组即可。
内容的提问来源于stack exchange,提问作者Xan
相关产品推荐
相关产品推荐

