You are looking for numpy.where:
Edit to bring the multiplication out so as to only do it once as suggested by @fountainhead in the comments
Numbers * np.where(Set == 'U', Uval, Lval)
numpy.where(condition[, x, y])
Return elements chosen from x or y depending on condition
So, for example:
>>> import numpy as np
>>> Set = np.array(['U', 'L', 'U', 'U', 'L', 'U', 'L', 'L', 'U', 'L', 'U', 'L', 'L', 'L', 'L'])
>>> Numbers = np.array([ 52599, 52599, 53598, 336368, 336875, 337466, 338292, 356587, 357474, 357763, 358491, 358659, 359041, 360179, 360286])
>>> Lval = 30
>>> Uval = 10
>>> Numbers * np.where(Set == 'U', Uval, Lval)
array([ 525990, 1577970, 535980, 3363680, 10106250, 3374660,
10148760, 10697610, 3574740, 10732890, 3584910, 10759770,
10771230, 10805370, 10808580])
One caveat, you end up using a lot of extra space, since you have to create the array Set == 'U', to pass it to the condition parameter numpy.where, and an intermediate array of Uval and Lvals. (and potentially other arrays to pass as the x and y parameters of numpy.where).
Despite all the unnecessary intermediates, it is still quite fast:
>>> Numbers = np.repeat(Numbers, 1000)
>>> import timeit
>>> timeit.timeit("Numbers * np.where(Set == 'U', Uval, Lval)", "from __main__ import np, Set, Numbers, Lval, Uval", number=10000)
1.067108618999555
The equivalent Python:
>>> setlist = Set.tolist()
>>> numberlist = Numbers.tolist()
>>> timeit.timeit("[n*Uval if s =='U' else n*Lval for s, n in zip(setlist, numberlist)]", "from __main__ import setlist, numberlist, Lval, Uval", number=10000)
10.844363432000023
numpy.where.xis a string, it would throw a type error withSet[x]andNumbers[x], iterating over a container gives you the elements of the container, not the indices...