Python中的嵌套列表 - 有效地移动条目和维度

时间:2012-02-28 00:50:32

标签: python

晚上好,

我试图将直方图滤波器定位推广到任意维度的离散环境。虽然在这一点上使用numpy可能是最好的选择,但我想坚持一个赋值的某些约束,它本身让我开始使用这个整体的2D到更高维度的能力。

首先,我选择了一个立方体环境(标记为1到27的每个部分):

debug = [[['1', '2', '3'],
          ['4', '5', '6'],
          ['7', '8', '9']],
         [['10', '11', '12'],
          ['13', '14', '15'],
          ['16', '17', '18']],
         [['19', '20', '21'],
          ['22', '23', '24'],
          ['25', '26', '27']]]

在直方图定位期间,机器人首先移动并随后测量输入,该输入有助于收集关于机器人本身所在位置的信息。在我有限的离散3D立方体环境中,我的机器人可以向上/向下飞行,向左/向右移动并向前/向后移动。每次我需要在机器人移动方向上执行更新(即改变驻留在某个段中的概率)。

前进/后退意味着改变行{1,10,19},{2,11,20},{3,12,21},......等等,而左/右将意味着改变行{1,2,3},{4,5,6},{7,8,9},......最后,上下意味着改变{1,4,7},... 所以我就是这样,基本的蟒蛇知识相对有限,我发现自己正在努力从2到3D的推广 - 但是甚至会喜欢它适用于更高维度的环境。关于下一步该怎么做的任何想法?有没有奇特的方法来转换给定的列表列表,以便前面描述的更新将成为一项简单的任务(如果它们还没有)?

谢谢大家!

2 个答案:

答案 0 :(得分:2)

不要使用列表列表,使用numpy.ndarray可以让您更轻松地进行所需的花哨索引/切片/转换。

>>> import numpy as np
>>> x = np.array(range(1, 28)).reshape((3, 3, 3))
>>> x
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]],

       [[19, 20, 21],
        [22, 23, 24],
        [25, 26, 27]]])
>>> x[:,0,0]
array([ 1, 10, 19])
>>> x[0,:,0]
array([1, 4, 7])
>>> x[0,0,:]
array([1, 2, 3])

答案 1 :(得分:0)

如果有人对我如何在没有numpy和任意维度的数组的情况下解决它感兴趣,那么代码就是:

def move(array, U):
'''
@attention: Only works on flattened arrays
'''
q = [0] * len(array)

if (sum(U) != 1):
    return array

for i in range(len(U)):

    if (U[i] != 0):
        dim = i
        step = U[i]

if (dim == len(__envdim) - 1):
    stepsize = 1
    skipsize = __envdim[dim]

else:
    stepsize = reduce(lambda x,y: x * y, __envdim[(dim + 1):])
    skipsize = 1

for i in range(__getmoveturns(dim)):

    for j in range(__envdim[dim]):
        startProb = array[(j*stepsize + i*skipsize)]
        q[((j+step)*stepsize%(stepsize * __envdim[dim]) + i*skipsize)] += startProb * p_move
        q[(j*stepsize + i*skipsize)] += startProb * (1 - p_move)
        # print array[(j*stepsize + i*skipsize)], array[((j+1)*stepsize%(stepsize * __envdim[dim]) + i*skipsize)],

return q
然而,它相当快速,肮脏且未经测试。 __envdim是一个包含环境维度的列表。比方说,我们有一个3x3x3的立方体,即[3,3,3]。 __getmoveturns返回所有尺寸长度的乘积,不包括我的移动所针对的尺寸。