You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

半监督学习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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:57:17