Python Cartesian Product in a constrained dictonary
Instead of itertools.product(*[markers  for i in xrange(n)]) use itertools.product(markers, repeat=n)
Instead of creating three random values and replace it with nan use List Comprehensions.
dict([(key, value) for key, value in ...]) creates dict object.
[bool and [a] or [b]][0] - safer version of bool and a or b - one-linear version of:

if bool:
    a
else:
    b



And final version:

import itertools
import numpy as np

def create_constrained_dict(n, markers):
    d = dict([(element, np.array([(i == 0 and [np.random.uniform(0, 1)] or [np.nan])[0]
                                  for i in element]))
              for element in itertools.product(markers, repeat=n)])
    return d


EDIT

Version without np.array - 2 times faster (thanks @JoeWallis):

import itertools
import numpy as np

def create_constrained_dict(n, markers):
    d = dict([(element, [(i == 0 and [np.random.uniform(0, 1)] or [np.nan])[0]
                         for i in element]))
              for element in itertools.product(markers, repeat=n)])
    return d