Numpy/Scipy Distributions and Statistical Operations: Examples & Reference

Last updated:
Table of Contents

For ways to sample from lists and distributions: Numpy sampling: Reference and Examples

Generate random int from 0 up to N

All integers from 0 (inclusive) to N-1 have equal probability

Template: np.random.randint(0, N)

import numpy as np

# generate a single int from 0 to 100 (exclusive)
np.random.randint(0,100)
# >>> 56

# generate 5 random ints from 0 to 100 (exclusive)
np.random.randint(0,100, size=5)
# >>> [29,52,89,9,22,3]

Generate random int in interval

Template: np.random.randint(A, B)

Again, all integers from A (inclusive) up to B-1 have equal probability

import numpy as np

# generate single int from 10 to 15 (exclusive)
np.random.randint(10,15)
# 12

# generate 5 random ints from 10 to 15 (exclusive)
np.random.randint(10,15, size=5)
# >>> [10,13,12,13,14]

Generate random float between 0 and 1

Generate a random number (float) from 0 (including) up to 0.99999... (depending on precision).

All real numbers from 0 to 0.99999... are generated with equal probability.

import numpy as np

# this is equivalent to np.random.uniform(low=0,high=1)
np.random.sample()
# 0.30220482

Evaluate x on a gaussian PDF

In other words, P(x) | P ~ Gaussian(0,1)

import scipy.stats as st

dist = st.norm(loc=0.0,scale=1.0)
dist.pdf(1.645)
# 0.10311081109198142

Evaluate x on a Gaussian CDF

In other words, what percentage of the density is to the left of x?

import scipy.stats as st

dist = st.norm(loc=0.0,scale=1.0)
dist.cdf(1.645)
# 0.95001509446087862

linspace VS arange

Use np.linspace if you care about the number of elements, use np.arange if you care about the step size

np.linspace np.arange
Set the number of elements you want
(regardless of the step size)
Set the step size you want
(regardless of the number of elements)

Generate N samples, evenly spaced

In this case generate 11 samples evenly spaced from 0.0 to 1.0

import numpy as np

# template is: linspace(start, stop, num=50)
x = np.linspace(0.0,1.0,11)
# array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ])

Generate samples, evenly spaced with step size

template: arange(start, stop, step)

import numpy as np

# template is: arange(start, stop, step)
x = np.arange(0.0,10.0,3)
# array([ 0.,  3.,  6.,  9.])

Generate numbers in logarithmic scale

template: logspace(start, stop, num=50)

Generate numbers in logarithmic scale: 0.001, 0.01, 0.1, 1.0, 10.0, etc.

import numpy as np

start=-3
stop=2

# num_elements is calculated using
# the range (start,stop) you chose above
num_elements = np.abs([start,stop]).sum() + 1

x = np.logspace(start,stop,num)
# array([  1.00000000e-03,   1.00000000e-02,   1.00000000e-01,
#        1.00000000e+00,   1.00000000e+01,   1.00000000e+02])

References

Dialogue & Discussion