尺寸为63和27的特征数组填充失效致SVM无法运行的问题
问题分析与解决方案
嘿,我懂你现在的困扰——处理特征数组填充时,大部分都搞定了,但偏有两个尺寸为67和27的数组始终没被正确填充到目标尺寸150,导致SVM因为维度一致的要求跑不起来,试了好几次方法都没效果对吧?咱们从你贴的代码里找找问题根源:
核心问题:numpy.pad不会原地修改数组
你代码里调用np.pad的方式有个很容易踩的坑:numpy的pad函数是返回一个新的填充后数组,不会直接修改原数组。你现在只是调用了pad,但没把返回的结果赋值回current_feature,所以不管调用多少次,原数组的尺寸都纹丝不动!
看你这段代码:
np.pad(current_feature, (0, pad_amount), 'constant') if current_feature.size != 150: np.pad(current_feature, (0, pad_amount), 'constant')
这两次pad调用完全是做无用功,current_feature还是原来的尺寸,那最后自然会剩下没填充好的数组。
修正后的代码方案
把pad的结果直接赋值给current_feature,同时我还加了循环内初始化的逻辑,避免之前的特征累加导致尺寸计算错误:
for idx1, f in enumerate(feature): if idx1 >= 50: break # 每次循环初始化current_feature,避免残留之前的特征数据 current_feature = [] current_feature.append(f[2]) current_feature.append(f[3]) current_feature.append(f[4]) current_feature = np.array(current_feature) pad_amount = 150 - current_feature.size # 只有当需要填充时才执行,并且把结果赋值回current_feature if pad_amount > 0: current_feature = np.pad(current_feature, (0, pad_amount), 'constant') print(current_feature.size) # 现在应该稳定输出150了 feed.append(current_feature)
额外验证小技巧
修改完后,你可以加一段代码验证所有特征的尺寸是否真的统一了,避免还有漏网之鱼:
# 检查所有特征是否都达到目标尺寸 all_uniform = all(arr.size == 150 for arr in feed) print(f"所有特征尺寸是否统一:{all_uniform}") # 如果还有不一致的,打印出具体索引和尺寸,方便排查 for idx, arr in enumerate(feed): if arr.size != 150: print(f"索引{idx}的特征尺寸异常:{arr.size}")
内容的提问来源于stack exchange,提问作者Ege Elgun
相关产品推荐
相关产品推荐

