変数x
とtheta
は、それぞれ[0, 1, 2]
と[0, 1, 2, 3]
の可能な値をとることができるとします。デカルト積を指数化する方法
具体的には、x = 1
とtheta = 3
としましょう。これを表現する自然な方法は、タプル(1,3)
です。しかし、代わりに単一のインデックスで状態(1,3)
にラベルを付けたいと思います。
import numpy as np
import itertools
N_x = 3
N_theta = 4
np.random.seed(seed = 1)
x = np.random.choice(range(N_x))
theta = np.random.choice(range(N_theta))
def get_box(x, N_x, theta, N_theta):
states = list(itertools.product(range(N_x),range(N_theta)))
inds = [i for i in range(len(states)) if states[i]==(x,theta)]
return inds[0]
print (x, theta)
box = get_box(x, N_x, theta, N_theta)
print box
これは、我々がそれを見れば理にかなって(x, theta) = (1,3)
とbox = 7
与える:これを行うための「ブルートフォース」メソッドは、すべての可能な順序対(x,theta)
のデカルト積を形成し、それをルックアップするためにありますstates
リストは:それを見ずに、事前にインデックスを決定することが可能でなければなりませんよう
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)]
しかし、この「ブルートフォース」アプローチは、非効率です。これを行う一般的な方法はありますか? (N_x
とN_theta
の状態の数は、実際のアプリケーションによって異なる場合があり、デカルト積にはより多くの変数が存在する可能性があります)。
ハッシュアドレッシングを使用すると、両方のコンポーネントを大きな定数でモジュロ化し、衝突の際に各ハッシュキーの背後にリストを追加できます。つまり、c2 *(x%c1)+(y%c2)がハッシュキーになります。 –