0

该代码是本地化算法的实现:

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


motions = [[0,0],[0,1],[1,0],[1,0],[0,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 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][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]*p_move
                new.append(val)
            q.append(new)

    return q

a=[[0 for i in range(len(colors[j]))] for j in range(len(colors))]

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


show(p)

TypeError上面的代码为以下语句抛出了问题中指定的内容:

val=lst[i][j-u]*p_move

请告诉我为什么会这样。我是 python 的新手,看不出编译器应该抛出这个错误的原因。此外,我正在尝试根据列表中存在的motions列表中的值更改列和行中的值。我试图实现这一目标的方式是否正确?

编辑

许多人询问此代码的目的。我将重复我在问题的评论部分中提到的内容:它是旨在实现本地化算法的代码的一部分。这部分代码用于计算移动的概率。成功移动到所需单元格的概率是 p_move = 0.8。如果命令设备移动到该单元格,则将给定单元格的先前概率乘以该值。

但是,其中一位评论员要求的示例输出需要包含我的代码的另一部分,这将需要进一步解释并进一步混淆目的。

4

2 回答 2

0

这是对您的代码的推测性改进。像许多其他人一样,我看不到您要做什么。此外,内部索引的设置move需要详细说明。大概它是来自 的一些值u

from pprint import pprint

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

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

p_move = 0.8

def move(lst, u):
    q = []
    if u[0] != 0:
        index = u[0]
        for i, elem in enumerate(lst):
            q.append([lst[j-index][i] * p_move] for j in range(len(elem)))
    elif u[1] != 0:
        index = u[1]
        for i, elem in enumerate(lst):
            q.append([lst[i][j-index] * p_move] for j in range(len(elem)))
    return q

def main():
    total = sum(len(c) for c in colors)
    p = [[1.0 / total] * len(c) for c in colors]
    a = [[0] * len(c) for c in colors]
    for m in motions:
        a = move(p, m)
    pprint(p)

main()
于 2013-09-07T12:21:15.657 回答
0

我不确定我是否完全理解您要做什么。@hughdbrown 对代码进行了许多改进,但我不知道你想用代码实现什么,所以我想知道你是否在寻找不同的东西。如果您希望根据动作列表中的动作更改特定值,那么简单如下:

a = [[0]*len(c) for c in colors]
index = [sum(x) for x in zip(*motions)]
a[index[0]][index[1]] = p[index[0]][index[1]] * p_move

或者,如果您希望更改运动中的每个值,则生成器功能可以工作:

def move(motions):
    index0, index1 = 0, 0
    for m in motions:
        index0 += m[0]
        index1 += m[1]
        yield (index0,index1)

motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]
a = [[0]*len(c) for c in colors]

for row,col in move(motions):
    a[row][col] = p[row][col]*p_move

show(motions)
show(p)
show(a)

输出:

[0, 0]
[0, 1]
[1, 0]
[1, 0]
[0, 1]

[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]

[0.04, 0.04, 0, 0, 0]
[0, 0.04, 0, 0, 0]
[0, 0.04, 0.04, 0, 0]
[0, 0, 0, 0, 0]
于 2013-09-07T13:53:43.663 回答