使用numpy.linspace循环插值触发IndexError列表索引越界报错求解
报错原因
- 核心问题是循环变量名重复覆盖:外层遍历输入序列的循环变量使用了
i,内层遍历插值采样点的循环也复用了i作为变量名,而Python的for循环变量没有块级作用域,内层对i的赋值会直接修改外层循环的i值。 - 当采样参数
n>16时,内层循环会把i最终赋值为n-1≥16,但输入的x/y/z/t列表长度只有16,有效索引范围是0~15,回到外层执行x[i]取值操作时就会触发索引越界错误。
修复方法
只需将内层遍历采样点的循环变量修改为不与外层冲突的名称即可,比如改为k,修改后的代码如下:
def interp(x0, x1, y0, y1, z0, z1, t0, t1, n): x = numpy.linspace(x0, x1, n) y = numpy.linspace(y0, y1, n) z = numpy.linspace(z0, z1, n) t = numpy.linspace(t0, t1, n) return x, y, z, t def interpolation(x, y, z, t, n): size = len(x) x_app = [] y_app = [] z_app = [] t_app = [] for i in range(size - 1): for j in range(i+1, size): x0, x1, y0, y1, z0, z1, t0, t1= x[i], x[j], y[i], y[j], z[i], z[j], t[i], t[j] x_int, y_int, z_int, t_int= interp(x0, x1, y0, y1, z0, z1, t0, t1, n) # 修改变量名,避免和外层的i冲突 for k in range(n): x_app.append(x_int[k]) y_app.append(y_int[k]) z_app.append(z_int[k]) t_app.append(t_int[k]) # 也可以用更简洁的extend写法代替内层循环,性能更高 # x_app.extend(x_int) # y_app.extend(y_int) # z_app.extend(z_int) # t_app.extend(t_int) return x_app, y_app, z_app, t_app
内容的提问来源于stack exchange,提问作者Salvatore Cipressa
相关产品推荐
相关产品推荐

