半监督学习SVM代码报索引越界 咨询np.empty()参数设置方法
半监督学习代码索引越界问题排查
错误根因
运行acc[i]抛出越界错误的核心原因是np.empty()初始化的数组长度和实际循环赋值次数不匹配:
- 你初始化
acc = np.empty(1)时,生成的是长度为1的一维numpy数组,仅存在索引为0的1个可写入位置 - 遍历
nc = np.arange(.40, 1, .03)时,该序列从0.4到1步长0.03共包含20个元素,循环会执行20次,计数器i会从0累加到19。第一次循环i=0可以正常写入,第二次循环i=1时就超出了acc数组的索引范围,直接触发报错。
np.empty()参数说明
np.empty()的第一个入参为生成数组的形状:
- 生成长度为N的一维数组,直接传入整数N即可,例如
np.empty(10)生成长度为10的一维空数组 - 生成多维数组传入元组即可,例如
np.empty((2,3))生成2行3列的二维空数组
注意:np.empty()不会初始化数组值,写入前必须手动给对应位置赋值,不要直接读取未赋值的位置
修正后代码
nc = np.arange(.40, 1, .03) # 直接用nc的长度初始化acc,后续调整nc的范围、步长时无需手动修改数组长度 acc = np.empty(len(nc)) i = 0 for k in np.nditer(nc): conf_ind = df['max'] > k X_train1 = np.append(x_train_np, unl_np[conf_ind, :], axis=0) # 取lab列时转一维numpy数组,避免和y_train_np拼接出现维度不匹配问题 Y_train1 = np.append(y_train_np, df.loc[conf_ind, 'lab'].values) clf = svm.SVC(kernel='linear', probability=True, C=1).fit(X_train1, Y_train1) acc[i] = clf.score(x_test, y_test) i += 1
额外优化提示
- 不建议硬编码acc数组的长度,使用
len(nc)动态获取循环总次数,能从根源上避免后续调整参数时再次出现长度不匹配的问题 - 原代码中
df.loc[conf_ind, ['lab']]取到的是二维DataFrame结构,和一维的y_train_np拼接时容易触发维度异常,改为df.loc[conf_ind, 'lab'].values转成一维numpy数组更稳妥
内容的提问来源于stack exchange,提问作者David Rimo
相关产品推荐
相关产品推荐

