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

Python实现任意波长输入扫描功能,解决数组索引越界及运算类型错误

问题原因及修改方案

错误1:IndexError 索引越界

遍历波长数组时使用idx+1访问下一个元素,当遍历到最后一个元素时,idx+1超出数组最大索引范围。同时原代码逻辑错误地取下一个波长作为当前要移动到的目标,和需求逻辑不符。

错误2:UFuncTypeError 运算类型不匹配

input()返回的是字符串类型,直接存入numpy数组后是字符串格式,无法直接执行数值减法运算,需要在输入时就转换为数值类型。

需要修改的核心点

  • 支持任意数量输入:先获取用户需要的扫描点总数,代替固定的3个输入
  • 输入时直接转换波长为float、曝光时间为float,避免类型错误
  • 只记录上一个停留的波长值,不需要通过索引访问下一个元素,彻底避免越界
  • 移除多余的无用内层循环

修正后完整代码

import numpy as np

def scanadv():
    # 获取需要扫描的波长点总数,支持任意数量输入
    point_num = int(input("请输入需要扫描的波长点总数:"))
    # 输入时直接转换为数值类型,避免字符串运算错误
    wavelist = np.array([float(input(f"输入第{i+1}个要扫描的波长:")) for i in range(point_num)])
    exposure = np.array([float(input(f"输入第{i+1}个波长对应的曝光时间(秒):")) for i in range(point_num)])
    
    home = 631.26 #nm 校准归位波长
    rev = 9000 #steps = 1 nm 步长换算系数
    
    # 初始位置为归位波长
    current_wave = home
    
    for target_wave, exp_time in zip(wavelist, exposure):
        # 计算当前位置到目标波长的差值、对应步长
        diff_wave = target_wave - current_wave
        diff_step = diff_wave * rev
        print(f"移动扫描控制器:移动{diff_wave}nm,到达{target_wave}nm,所需机械步长:{diff_step}")
        # 此处可补充移动到目标波长的控制代码
        print(f"当前位置曝光,保持{exp_time}秒")
        # 此处可补充曝光控制代码
        print(f"{target_wave}nm曝光完成")
        # 更新当前波长为刚完成扫描的波长
        current_wave = target_wave

功能说明

修改后的代码完全匹配需求逻辑:

  • 第一个扫描点计算和归位波长的差值,后续扫描点计算和上一个扫描波长的差值
  • 支持任意数量的波长/曝光时间输入,不再限制为固定3个
  • 无索引越界问题,也不会出现字符串运算错误

内容的提问来源于stack exchange,提问作者Olivia Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 22:51:02