
- NumPy - Home
- NumPy - Introduction
- NumPy - Environment
- NumPy Arrays
- NumPy - Ndarray Object
- NumPy - Data Types
- NumPy Creating and Manipulating Arrays
- NumPy - Array Creation Routines
- NumPy - Array Manipulation
- NumPy - Array from Existing Data
- NumPy - Array From Numerical Ranges
- NumPy - Iterating Over Array
- NumPy - Reshaping Arrays
- NumPy - Concatenating Arrays
- NumPy - Stacking Arrays
- NumPy - Splitting Arrays
- NumPy - Flattening Arrays
- NumPy - Transposing Arrays
- NumPy Indexing & Slicing
- NumPy - Indexing & Slicing
- NumPy - Indexing
- NumPy - Slicing
- NumPy - Advanced Indexing
- NumPy - Fancy Indexing
- NumPy - Field Access
- NumPy - Slicing with Boolean Arrays
- NumPy Array Attributes & Operations
- NumPy - Array Attributes
- NumPy - Array Shape
- NumPy - Array Size
- NumPy - Array Strides
- NumPy - Array Itemsize
- NumPy - Broadcasting
- NumPy - Arithmetic Operations
- NumPy - Array Addition
- NumPy - Array Subtraction
- NumPy - Array Multiplication
- NumPy - Array Division
- NumPy Advanced Array Operations
- NumPy - Swapping Axes of Arrays
- NumPy - Byte Swapping
- NumPy - Copies & Views
- NumPy - Element-wise Array Comparisons
- NumPy - Filtering Arrays
- NumPy - Joining Arrays
- NumPy - Sort, Search & Counting Functions
- NumPy - Searching Arrays
- NumPy - Union of Arrays
- NumPy - Finding Unique Rows
- NumPy - Creating Datetime Arrays
- NumPy - Binary Operators
- NumPy - String Functions
- NumPy - Matrix Library
- NumPy - Linear Algebra
- NumPy - Matplotlib
- NumPy - Histogram Using Matplotlib
- NumPy Sorting and Advanced Manipulation
- NumPy - Sorting Arrays
- NumPy - Sorting along an axis
- NumPy - Sorting with Fancy Indexing
- NumPy - Structured Arrays
- NumPy - Creating Structured Arrays
- NumPy - Manipulating Structured Arrays
- NumPy - Record Arrays
- Numpy - Loading Arrays
- Numpy - Saving Arrays
- NumPy - Append Values to an Array
- NumPy - Swap Columns of Array
- NumPy - Insert Axes to an Array
- NumPy Handling Missing Data
- NumPy - Handling Missing Data
- NumPy - Identifying Missing Values
- NumPy - Removing Missing Data
- NumPy - Imputing Missing Data
- NumPy Performance Optimization
- NumPy - Performance Optimization with Arrays
- NumPy - Vectorization with Arrays
- NumPy - Memory Layout of Arrays
- Numpy Linear Algebra
- NumPy - Linear Algebra
- NumPy - Matrix Library
- NumPy - Matrix Addition
- NumPy - Matrix Subtraction
- NumPy - Matrix Multiplication
- NumPy - Element-wise Matrix Operations
- NumPy - Dot Product
- NumPy - Matrix Inversion
- NumPy - Determinant Calculation
- NumPy - Eigenvalues
- NumPy - Eigenvectors
- NumPy - Singular Value Decomposition
- NumPy - Solving Linear Equations
- NumPy - Matrix Norms
- NumPy Element-wise Matrix Operations
- NumPy - Sum
- NumPy - Mean
- NumPy - Median
- NumPy - Min
- NumPy - Max
- NumPy Set Operations
- NumPy - Unique Elements
- NumPy - Intersection
- NumPy - Union
- NumPy - Difference
- NumPy Random Number Generation
- NumPy - Random Generator
- NumPy - Permutations & Shuffling
- NumPy - Uniform distribution
- NumPy - Normal distribution
- NumPy - Binomial distribution
- NumPy - Poisson distribution
- NumPy - Exponential distribution
- NumPy - Rayleigh Distribution
- NumPy - Logistic Distribution
- NumPy - Pareto Distribution
- NumPy - Visualize Distributions With Sea born
- NumPy - Matplotlib
- NumPy - Multinomial Distribution
- NumPy - Chi Square Distribution
- NumPy - Zipf Distribution
- NumPy File Input & Output
- NumPy - I/O with NumPy
- NumPy - Reading Data from Files
- NumPy - Writing Data to Files
- NumPy - File Formats Supported
- NumPy Mathematical Functions
- NumPy - Mathematical Functions
- NumPy - Trigonometric functions
- NumPy - Exponential Functions
- NumPy - Logarithmic Functions
- NumPy - Hyperbolic functions
- NumPy - Rounding functions
- NumPy Fourier Transforms
- NumPy - Discrete Fourier Transform (DFT)
- NumPy - Fast Fourier Transform (FFT)
- NumPy - Inverse Fourier Transform
- NumPy - Fourier Series and Transforms
- NumPy - Signal Processing Applications
- NumPy - Convolution
- NumPy Polynomials
- NumPy - Polynomial Representation
- NumPy - Polynomial Operations
- NumPy - Finding Roots of Polynomials
- NumPy - Evaluating Polynomials
- NumPy Statistics
- NumPy - Statistical Functions
- NumPy - Descriptive Statistics
- NumPy Datetime
- NumPy - Basics of Date and Time
- NumPy - Representing Date & Time
- NumPy - Date & Time Arithmetic
- NumPy - Indexing with Datetime
- NumPy - Time Zone Handling
- NumPy - Time Series Analysis
- NumPy - Working with Time Deltas
- NumPy - Handling Leap Seconds
- NumPy - Vectorized Operations with Datetimes
- NumPy ufunc
- NumPy - ufunc Introduction
- NumPy - Creating Universal Functions (ufunc)
- NumPy - Arithmetic Universal Function (ufunc)
- NumPy - Rounding Decimal ufunc
- NumPy - Logarithmic Universal Function (ufunc)
- NumPy - Summation Universal Function (ufunc)
- NumPy - Product Universal Function (ufunc)
- NumPy - Difference Universal Function (ufunc)
- NumPy - Finding LCM with ufunc
- NumPy - ufunc Finding GCD
- NumPy - ufunc Trigonometric
- NumPy - Hyperbolic ufunc
- NumPy - Set Operations ufunc
- NumPy Useful Resources
- NumPy - Quick Guide
- NumPy - Cheatsheet
- NumPy - Useful Resources
- NumPy - Discussion
- NumPy Compiler
NumPy - Multinomial Distribution
What is the Multinomial Distribution?
The multinomial distribution is a generalization of the binomial distribution. It represents the probabilities of multiple outcomes in a series of experiments, where each trial has a fixed number of outcomes and a given probability for each. It is defined by two parameters −
- n: The number of trials or experiments.
- p: A list or array of probabilities for each outcome. The sum of probabilities must equal 1.
For example, consider rolling a six-sided die 10 times. The multinomial distribution can help determine the probabilities of each face appearing a certain number of times.
Generating Multinomial Samples in NumPy
NumPy provides the numpy.random.multinomial() function to generate random samples from a multinomial distribution. This function requires specifying the number of trials and the probabilities for each outcome.
Example
Here, each row represents the results of a single experiment, showing the number of occurrences for each outcome −
import numpy as np # Define parameters # Number of trials n = 10 # Probabilities for 4 outcomes p = [0.1, 0.3, 0.4, 0.2] # Generate samples samples = np.random.multinomial(n, p, size=5) print(samples)
Following is the output obtained −
[[1 2 5 2] [1 5 2 2] [0 5 4 1] [0 4 4 2] [0 4 4 2]]
Understanding the Mathematical Foundation
The PMF of a multinomial distribution calculates the probability of specific outcomes based on given parameters. Mathematically, it is expressed as −
P(X1 = x1, ..., Xk = xk) = (n! / (x1! * ... * xk!)) * (p1x1) * ... * (pkxk)
Where,
- n: Total number of trials.
- p1, ..., pk: Probabilities of each outcome.
- x1, ..., xk: Observed frequencies of each outcome.
Understanding this formula helps you interpret the results and validate the samples generated by NumPy.
Simulating Real-World Scenarios
The multinomial distribution is widely used in real-world scenarios such as election results, dice rolls, and genetic probabilities.
Let us simulate a few examples to understand its practical applications:
Example 1: Simulating Dice Rolls
In this example, we simulate rolling a six-sided die 20 times and calculate the frequencies of each face −
import numpy as np # Simulating dice rolls # Number of rolls n = 20 # Equal probability for each face p = [1/6] * 6 # Generate results results = np.random.multinomial(n, p) print("Frequencies of dice rolls:", results)
Each value represents the frequency of a face appearing in the experiment −
Frequencies of dice rolls: [5 2 5 5 3 0]
Example 2: Predicting Election Results
Suppose an election has three candidates, and we want to simulate 100 voter's choices based on predicted probabilities −
import numpy as np # Simulating election results # Number of voters n = 100 # Probabilities for each candidate p = [0.4, 0.35, 0.25] # Generate election simulation results = np.random.multinomial(n, p) print("Votes for each candidate:", results)
This demonstrates how the multinomial distribution can be used in probabilistic scenarios −
Votes for each candidate: [48 31 21]
Visualizing Multinomial Distribution
Visualization is a powerful way to analyze and interpret data. Using Matplotlib, we can plot the results of the multinomial distribution for better understanding.
Example: Bar Plot for Multinomial Results
import numpy as np import matplotlib.pyplot as plt # Visualizing results outcomes = ['Outcome 1', 'Outcome 2', 'Outcome 3', 'Outcome 4'] frequencies = np.random.multinomial(50, [0.2, 0.3, 0.4, 0.1]) plt.bar(outcomes, frequencies, color='skyblue') plt.title('Multinomial Distribution Visualization') plt.xlabel('Outcomes') plt.ylabel('Frequencies') plt.show()
The result displays a bar plot showing the frequencies of each outcome from the multinomial distribution −

Comparing Multinomial and Binomial Distributions
While the binomial distribution deals with two possible outcomes (e.g., success and failure), the multinomial distribution extends this to multiple outcomes.
For instance, while a binomial distribution can model coin tosses, the multinomial distribution can model dice rolls or categorical data with more than two outcomes.
Key Differences
Following are the major differences between multinomial and binomial distributions −
- Number of outcomes: Binomial has two outcomes, while multinomial has more.
- Complexity: Multinomial requires specifying probabilities for multiple categories.
- Applications: Multinomial is more versatile for scenarios involving categorical data.
Customizing Multinomial Simulations
NumPy allows flexibility in customizing simulations by adjusting parameters such as the number of trials, probabilities, and the size of the generated samples.
Let us see an example where we simulate multiple experiments with varying probabilities.
Example: Multiple Simulations with Different Probabilities
The following examples demonstrates how adjusting probabilities affects the outcomes −
import numpy as np # Customizing probabilities probabilities = [ [0.5, 0.3, 0.2], [0.4, 0.4, 0.2], [0.6, 0.2, 0.2] ] for p in probabilities: results = np.random.multinomial(20, p) print(f"Probabilities: {p} => Results: {results}")
After executing the above code, we get the following output −
Probabilities: [0.5, 0.3, 0.2] => Results: [ 9 10 1] Probabilities: [0.4, 0.4, 0.2] => Results: [ 4 12 4] Probabilities: [0.6, 0.2, 0.2] => Results: [12 4 4]