晚上好,
我试图将直方图滤波器定位推广到任意维度的离散环境。虽然在这一点上使用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的推广 - 但是甚至会喜欢它适用于更高维度的环境。关于下一步该怎么做的任何想法?有没有奇特的方法来转换给定的列表列表,以便前面描述的更新将成为一项简单的任务(如果它们还没有)?
谢谢大家!
答案 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返回所有尺寸长度的乘积,不包括我的移动所针对的尺寸。