I am trying to get a get a sequence of randomly chosen numbers when the condition is True.
I have a NumPy array full of Boolean numbers:
In [1]: multiples
Out[1]: array([False, False, False, True, True, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, True, True, True, True, False, False, False,
False, False, False, True, True, False, True, True, False,
False, False, False, True, True, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, True, True, False,
False, False, False, False, True, True, True, False, True,
True, False, False, False, True, True, False], dtype=bool)
And I want to convert it into an array of values based on the condition:
If the value is
Truereturn a randomly chosen number from[-1, 0, 1], or return0.
So in the case of the above example, I want to output to look like:
Out[2]: array([ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0,
1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0])
There is numpy.where() which almost gives me what I want:
In [3]: numpy.where(multiples, numpy.random.choice([-1, 0, 1], 1), 0)
Out[3]: array([ 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0,
0, 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0,
-1, -1, -1, 0, -1, -1, 0, 0, 0, -1, -1, 0])
But the problem is that it executes numpy.random.choice([-1, 0, 1], 1) only once, and keeps that result and uses it everywhere. I want it to run for each time the value in multiples is True.