I'm trying to generate an numpy array with randomly generated elements (it's similar like bernouilli distribution. The thing is I want to achieve it without using numpy.random.binomial
function). Only function that fits after searching documentation and some forums is numpy.fromfunction
. But I encountered a problem that this function doesn't generate n elements, but one.
I expect output something like:
[0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1]
This function generates 1 element only, no matter what shape is in tuple:
np.fromfunction(lambda i : np.random.choice([0, 1], p=[0.1, 0.9]), (20, ))
#returns 1 or 0
np.fromfunction(lambda i ,j : np.random.choice([0, 1], p=[0.1, 0.9]), (20, 1))
#still returns 1 or 0
Though I tried implementing "i" into the output stupidest way possible but.. it changed something, but still didn't help:
np.fromfunction(lambda i : i*0 + np.random.choice([0, 1], p=[0.1, 0.9]), (20, ))
#returns
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
It's closer to the shape I want, but this ones or zeros are just repeated on all the array, so nothing's changed really.
To sum up: I have a function f()
that generates randomly with some probability 0 and 1, and is there any other function in numpy that can repeat function f()
on array, or maybe some way to repair the example above?
As @paime said in the comments, np.fromfunction
is called once with the argument passed to it being an array. You can just use np.random.choice
and specify size in it
In [1]: np.random.choice([0, 1], p=[0.1, 0.9], size=(20,))
Out[1]: array([1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1])