Design of experiments library for Python with comprehensive experimental design capabilities
npx @tessl/cli install tessl/pypi-pydoe3@1.3.0A comprehensive Design of Experiments (DOE) library for Python that enables scientists, engineers, and statisticians to construct appropriate experimental designs for research and optimization. pyDOE3 provides a wide range of classical and modern experimental design methods with mathematical rigor and computational efficiency.
pip install pyDOE3import pyDOE3Common for specific design types:
from pyDOE3 import bbdesign, ccdesign, fullfact, ff2n, fracfact, lhs, taguchi_designImport optimal design functionality:
from pyDOE3.doe_optimal import optimal_design, d_optimality, fedorovimport pyDOE3
import numpy as np
# Create a 2-level full factorial design for 3 factors
factorial_design = pyDOE3.ff2n(3)
print("2^3 Factorial Design:")
print(factorial_design)
# Create a Latin Hypercube Sample with 10 points in 4 dimensions
lhs_design = pyDOE3.lhs(4, samples=10)
print("\nLatin Hypercube Sample:")
print(lhs_design)
# Create a Box-Behnken design for 3 factors
bb_design = pyDOE3.bbdesign(3)
print("\nBox-Behnken Design:")
print(bb_design)
# Create a Central Composite Design for 2 factors
cc_design = pyDOE3.ccdesign(2)
print("\nCentral Composite Design:")
print(cc_design)pyDOE3 is organized into several functional areas:
Traditional experimental designs including full factorial, fractional factorial, and screening designs. These form the foundation of experimental design methodology and are suitable for factor screening and main effects analysis.
def fullfact(levels): ...
def ff2n(n): ...
def fracfact(gen): ...
def fracfact_by_res(n, res): ...
def fracfact_opt(n_factors: int, n_erased: int, max_attempts: int = 0) -> str: ...
def fracfact_aliasing(design: np.ndarray) -> dict: ...
def alias_vector_indices(n_factors: int) -> List[int]: ...
def pbdesign(n): ...
def gsd(levels, reduction, n=1): ...Designs optimized for fitting response surface models and process optimization. These designs efficiently estimate quadratic effects and interaction terms for modeling and optimization applications.
def bbdesign(n, center=None): ...
def ccdesign(n, center=(4, 4), alpha="orthogonal", face="circumscribed"): ...
def doehlert_shell_design(num_factors, num_center_points=1): ...
def doehlert_simplex_design(num_factors): ...Space-filling and randomized experimental designs for computer experiments, Monte Carlo simulation, and uncertainty quantification. These designs provide uniform coverage of the experimental space.
def lhs(n: int, samples: int = None, criterion: str = None, iterations: int = None, random_state: Union[int, np.random.RandomState] = None, correlation_matrix: np.ndarray = None) -> np.ndarray: ...
def sukharev_grid(num_points: int, dimension: int) -> np.ndarray: ...
def fold(H: np.ndarray, columns: List[int] = None) -> np.ndarray: ...Taguchi methodology for robust parameter design with orthogonal arrays and signal-to-noise ratio analysis. These methods focus on minimizing variability and improving product/process robustness.
def taguchi_design(oa_name: str, levels_per_factor: List[List[int]]) -> np.ndarray: ...
class TaguchiObjective(Enum): ...
def compute_snr(responses: np.ndarray, objective: TaguchiObjective = TaguchiObjective.LARGER_IS_BETTER) -> np.ndarray: ...
def list_orthogonal_arrays() -> List[str]: ...
def get_orthogonal_array(oa_name: str) -> np.ndarray: ...Advanced experimental design algorithms with multiple optimality criteria for creating customized experimental plans. These methods provide maximum statistical efficiency for specific modeling objectives. Note: These functions are available through the pyDOE3.doe_optimal submodule.
# Available through pyDOE3.doe_optimal submodule
from pyDOE3.doe_optimal import optimal_design, d_optimality, a_optimality, fedorov, detmax
def optimal_design(candidates: np.ndarray, n_points: int, degree: int, criterion: Literal["D", "A", "I"] = "D", method: Literal["sequential", "simple_exchange", "fedorov", "modified_fedorov", "detmax"] = "detmax", alpha: float = 0.0, max_iter: int = 200) -> Tuple[np.ndarray, dict]: ...
def d_optimality(M: np.ndarray) -> float: ...
def a_optimality(M: np.ndarray) -> float: ...
def fedorov(candidates: np.ndarray, n_points: int, degree: int, criterion: str = "D", alpha: float = 0.0, max_iter: int = 200) -> np.ndarray: ...
def detmax(candidates: np.ndarray, n_points: int, degree: int, criterion: str = "D", alpha: float = 0.0, max_iter: int = 200) -> np.ndarray: ...Statistical analysis tools and advanced design manipulation functions for evaluating and modifying experimental designs.
def var_regression_matrix(H: np.ndarray, x: np.ndarray, model: str, sigma: float = 1) -> np.ndarray: ...Utilities & Advanced Functions
from enum import Enum
from typing import List, Optional, Union, Tuple, Literal
import numpy as np
class TaguchiObjective(Enum):
LARGER_IS_BETTER = "larger_is_better"
SMALLER_IS_BETTER = "smaller_is_better"
NOMINAL_IS_BEST = "nominal_is_best"
# Common type aliases used throughout the library
DesignMatrix = np.ndarray
LevelSpec = Union[int, List[int]]
GeneratorString = str
OptimalityCriterion = str