繁体   English   中英

这个python代码片段有什么问题?

[英]What is wrong with this python code snippet?

概述 :我是python的新手,我在python中实现了一个本地化算法。 执行此代码的机器人首先感知其环境,并且如果单元格的颜色与measurements列表中的颜色匹配,则通过sensor_right乘以概率分布。 move功能将机器人移动到所需位置,移动成功概率为0.8:

代码:

colors = [['red', 'green', 'green', 'red' , 'red'],
          ['red', 'red', 'green', 'red', 'red'],
          ['red', 'red', 'green', 'green', 'red'],
          ['red', 'red', 'red', 'red', 'red']]

measurements = ['green', 'green', 'green' ,'green', 'green']


motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]

sensor_right =1

p_move = 0.8

def show(p):
    for i in range(len(p)):
        print p[i]

p = []
sum=0
for i in range(len(colors)):
    for j in range(len(colors[i])):
        sum+=1

p=[[1.0/sum for j in range(len(colors[i]))] for i in range(len(colors))]

def sense(p,z):
    q=[]
    sum=0
    for i in range(len(colors)):
        new=[]
        for j in range(len(colors[i])):
            if (colors[i][j]==z) :
                new.append(p[i][j]*sensor_right)
                sum+=p[i][j]*sensor_right
            else :
                new.append(p[i][j]*(1-sensor_right))
                sum+=p[i][j]*(1-sensor_right)

        q.append(new)
    for i in range(len(q)):
        for j in range(len(q)):
            q[i][j]/=sum

    return q

def move(lst,u=[]):
    q=[]
    if (u[0]!=0) :
        for i in range(len(lst)):
            new=[]
            for j in range(len(lst[i])):
                val=lst[j-u[0]][i]*p_move
                new.append(val)
            q.append(new)



    elif (u[1]!=0) :
        for i in range(len(lst)):
            new=[]
            for j in range(len(lst[i])):
                val=lst[i][j-u[1]]*p_move
                new.append(val)
            q.append(new)

    return q

for i in range(len(measurements)):
    p=sense(p,measurements[i])
    p=move(p,motions[i])


show(p)

问题:编译器返回以下输出:

in sense new.append(p[i][j]*(1-sensor_right)) IndexError: list index out of range

当我调用注释motions方法时,编译器没有抛出错误并显示正确的输出。 但奇怪的是,当我检查motions方法的输出时,它返回的2 d列表与在循环中调用它时传递给sense方法的2-d列表具有相同的维度。此外,为什么没有编译器抛出错误

new.append(p[i][j]*sensor_right)
sum+=p[i][j]*sensor_right

如果指数超出范围。

为什么编译器会抛出此错误?

你一直提到'编译器'。 Python没有编译器。 它是一种解释型语言,这意味着它在找到程序时直接执行程序的文本。 pyc有一个中间步骤,它是文本的编译版本,但实际上并不相关)。

如果您习惯于编译语言,那么这可能会令人困惑。 问题不在于编译器在静态上下文中给出了错误,它是程序实际运行的结果,并且i超出了p的范围,或者j超出了p[i]

您可以从运行时错误中分离出语法错误(将在Python运行时加载并尝试解析程序时触发),但没有中间步骤。 这在逻辑上与编译程序不同,因为在运行时,程序的一位可以改变变量的值(因此也就是类型)。

要解决当前问题,请打印ij ,以及p ,您将能够缩小问题发生的位置。

如果你这样做,你会看到对move的调用返回[]并且这被分配回p 因此,下次运行range循环时,将使用p = []调用sense ,并且任何索引访问都将抛出超出范围的错误。

要解决这个问题,请查看程序的逻辑并确定为什么sense返回[]以及为什么函数试图用无效索引索引p

第一次通过你for i in range(len(measurements)): p是5x4列表, sense()的返回是分配给p的5x4列表。 p然后被分配到的输出move(p,[0,0])为在这两个条件move()是假move()返回一个空列表。 第二次你得到的异常恰好落在了else: sense()分支sense()

如果你打算使用这种矩阵操作,我建议你看看numpy 我已经重写了部分代码,以便您可以比较并了解它的运行方式:

import numpy as np

colors = np.array([['red', 'green', 'green', 'red' , 'red'],
                   ['red', 'red', 'green', 'red', 'red'],
                   ['red', 'red', 'green', 'green', 'red'],
                   ['red', 'red', 'red', 'red', 'red']])

sensor_right = 1
p = np.ones_like(colors, dtype=np.float) / colors.size

def sense(p, z):
    condition = colors == z
    p[condition] *= sensor_right
    p[~condition] *= 1 - sensor_right
    return p / p.sum()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM