2012-02-28 13 views
2

こんばんは、私は任意の次元の離散的な環境へのヒストグラムフィルタのローカライズを一般化しようとしていますネストされたリストは - 効率的

寸法と一緒にエントリをシフト。この時点ではnumpyで作業するのがおそらく最良の選択ですが、私はこの全体の2Dからより高次の能力のものから私を始めてくれた課題の特定の制約に固執したいと思います。ヒストグラム局在中ロボット最初の移動を

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']]] 

、その後ロボットに関する情報を収集するのに役立つ入力を測定:

を開始するため、私は、立方環境(各セグメント27 1〜標識)を選択しましたそれ自体が存在している。私の限定された離散した3Dキューブ環境では、私のロボットは上/下を飛行し、左右に移動し、前進/後退することができます。ロボットの移動方向に沿って更新を実行する必要があるたびに(つまり、特定のセグメントに存在する確率を変更する)必要があります。

前方/後方への移動は、{1,10,19}、{2,11,20}、{3,12,21}、...などの行を変更することを意味します。行{1,2,3}、{4,5,6}、{7,8,9}、...を変更することを意味します。最終的に、上下することは{1,4,7}を変更することを意味します。 。 これは私の所で、基本的なPythonの知識が限られているため、2次元から3次元への一般化との闘いで自分自身を見つけましたが、より高次元の環境でもうまくいきます。次に何をするべきかについてのアイデア?既に説明したような更新が簡単な作業になるようなリストのリストを変換する方法はありますか?

ありがとうございました!

答えて

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]) 
+0

これは私が通常行うものです。 assignmntの制約のためにnumpyなしで始めました。そして、変更のために、それなしで続行したいと思っていました。それでもあなたの答えに感謝します! (私ができればアップヴォートするでしょう) – limbonic

+0

しかし、numpyを使用して何の利益を得られないのでしょうか? – wim

+0

正直言って、私はむしろ欠点があると思います。今日何時間も投資して "スマート"なものを見つけようとしたところ、私の野望は走っていた;) – limbonic

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は、移動が指示されている次元を除くすべての次元の長さの積を返します。

関連する問題