Предположим, что переменные x
и theta
могут принимать возможные значения [0, 1, 2]
и [0, 1, 2, 3]
, соответственно.Как индексировать декартово произведение
Предположим, что в одной реализации, x = 1
и theta = 3
. Естественным способом представления этого является кортеж (1,3)
. Однако я хотел бы вместо этого пометить состояние (1,3)
одним индексом. А «грубой силы» метод делает это, чтобы сформировать декартово произведение всех возможных упорядоченных пар (x,theta)
и посмотреть его:
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
, что имеет смысл, если мы посмотрим его в 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) будет хеш-ключом. –