Python中的嵌套列表可以有效地沿维度移动条目

2024-05-12 22:28:34 发布

您现在位置:Python中文网/ 问答频道 /正文

晚上好

我试图将直方图滤波器定位推广到任意维的离散环境。尽管在这一点上,与numpy合作可能是最好的选择,但我还是要坚持某项任务的某些限制,这本身就让我开始了从二维到更高维度的能力。在

首先,我选择了一个立方环境(每个段的标签从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']]]

在柱状图定位过程中,机器人首先移动,然后测量一个有助于收集机器人自身所在位置的信息的输入。在我有限的离散三维立方体环境中,我的机器人可以上/下、左/右移动和前进/后退。每次我需要沿着机器人的运动方向执行更新(即改变驻留在某一段的概率)。在

向前/向后移动意味着改变行{1,10,19},{2,11,20},{3,12,21},。。。以此类推,而向左/向右移动意味着改变{1,2,3},{4,5,6},{7,8,9},。。。最终,上下移动意味着改变{1,4,7},。。。 所以这就是我所处的地方,在相对有限的python基础知识的情况下,我发现自己正在努力从2到3D进行泛化,但是我甚至希望它能适用于更高维的环境。下一步该怎么办?是否有一些奇特的方法来转换给定的列表列表,使前面描述的更新成为一项简单的任务(如果还没有的话)?在

谢谢大家!在


Tags: 定位debugnumpy信息列表环境过程机器人
2条回答

如果有人对我如何在没有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返回所有维度长度的乘积,不包括我移动的维度。在

不要使用列表列表,使用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])

相关问题 更多 >