Restricting numpy.random.lognormal to a given range, Python

I'm trying to sample a random number using a log normal distribution fitted to a data set of ages.

Age_abscess = numpy.random.lognormal(mean=numpy.log(29.9090909),
              sigma=numpy.log(11.6574484),size=None)

I sometimes get answers to the tune of something ^23 and smaller than 1. Given that I want these to be ages, is there a way to restrict the draw to be between 0 and 100?

Edit: After some brainstorming I came up with:

def lognormal(mean,sigma):
    age = numpy.random.lognormal(mean=numpy.log(mean),sigma=numpy.log(sigma),size=None)
    if 0>= age <= 100:
    age=age
return age

However, this will only run once, so I'll have to figure out how to loop it until it satisfies the condition. This has probably been asked before-will update if I find the answer.

It looks like you're looking for truncated log-normal distribution. Numpy doesn't have one but you can find other custom implementations like this one:

The other option that you have is to discard your drawing and repeat it if your condition of age is not met!

Edit: if you want to drop the values you don't want you'll just need to replace the for with while in your code:

Edit 2: as kevinkayaks pointed out, you'll need to create an infinite loop and break once your condition is met!

def lognormal(mean,sigma):
    while True:
        age = numpy.random.lognormal(mean=numpy.log(mean),sigma=numpy.log(sigma),size=None)
        if age>=0 and age <= 100:
            break
    return age

numpy.random.lognormal — NumPy v1.19 Manual, Draw samples from a log-normal distribution with specified mean, Note that the mean and standard deviation are not the values for the� numpy.random.lognormal¶ numpy.random.lognormal (mean=0.0, sigma=1.0, size=None) ¶ Draw samples from a log-normal distribution. Draw samples from a log-normal distribution with specified mean, standard deviation, and array shape.

def lognormal(mean,sigma):
    while True:
        age = np.random.lognormal(mean=np.log(mean),sigma=np.log(sigma),size=None)
        if age >= 0 and age <= 100:
            break
    return age

The accepted answer should not work. Maybe I'm confused

Python: package numpy.random - PyOpenGL, random Uniformly distributed values of a given shape. bytes Uniformly The probability density function for the log-normal distribution is .. math:: p(x) [2] P. R. Peebles Jr., "Central Limit Theorem" in "Probability, Random Variables and � Output shape. If the given shape is, e.g., (m, n, k), then m * n * k samples are drawn. If size is None (default), a single value is returned if mean and sigma are both scalars. Otherwise, np.broadcast(mean, sigma).size samples are drawn. Returns out ndarray or scalar. Drawn samples from the parameterized log-normal distribution.

The above answers only apply to a single value. If you want a vector of values within that range, you can either endlessly loop until you get a series of values that magically fit your range or you can replace the values outside of your range by re-drawing a sample from your base distribution (replace by exception).

i = 0
while True:
   # for first iteration, make an initial vector of random values
   if i == 0:
       V = np.round(np.random.lognormal(mu, sigma, 1000),2)

   #Make binary vectors for those values that are out of range and in range
   V_outRange = (V > 100) + 0.
   V_good = (V < 100) + 0.

   #keep the values in range
   V_ok = np.multiply(V, V_good)

   #Resample values that are out of range
   V_next = np.round(np.multiply(V_outRange, np.random.lognormal(mu, sigma, 1000)),2)

   #Re-combine previous in-range values with newly sampled values
   V = V_ok + V_next

   #check to see if all values are in range, if not re-loop
   if (np.count_nonzero(V > 100)) == 0:
       break

   i += 1

lognormal - Numpy and Scipy Documentation, Confidence interval tells you how confident you can be that the results from Population: data set that contains all members of a specified group. converges to normal distribution according to the Centeral Limit Theorem. distribution sim_2 = [np.random.lognormal(np.mean(sample), np.mean(sample))� numpy.random() in Python. The random is a module present in the NumPy library. This module contains the functions which are used for generating random numbers.

Comprehensive Confidence Intervals for Python Developers , Return evenly spaced values within a given interval. Values are generated sum(np.random.binomial(9,0.1,20000)==0)/20000. answer = 0.38885, or 38%. Python’s NumPy module has a numpy.random package to generate random data. To create a random multidimensional array of integers within a given range, we can use the following NumPy methods: randint() random_integers() np.randint(low[, high, size, dtype]) To get random integers array from low (inclusive) to high (exclusive).

Python: module ESA.util.gen_plots, Provides wrappers for several random number generators (RNGs), giving them all from copy import deepcopy import logging import numpy.random try: reduce which may be more efficient, or a standard Python rng, e.g. a numpy.random. in the range [0, 1) If `mask` is provided, it should be a boolean or integer NumPy � Python range() Function Built-in Functions. Example. Create a sequence of numbers from 0 to 5, and print each item in the sequence: x = range(6) for n in x: print(n)

pyNN.random — PyNN 0.9.5 documentation, Help on package numpy.random in numpy: NAME numpy.random FILE in a given range. permutation Randomly permute a sequence / generate a random sequence. Draw samples from a log-normal distribution with specified mean, standard The Poisson distribution is the limit of the binomial distribution for large N. 0 Possible to decompress bz2 in python to a file instead of memory Apr 27 0 How to convert degree minute second to degree decimal Mar 22 '19 0 Restricting numpy.random.lognormal to a given range, Python Mar 29 '19

Comments
  • you have an indentation error in the conditional
  • Thank you! Do you have a suggestion as to how I can achieve the discarding the draw message?
  • look at my updated answer! just need to replace for with while :)