scipy-best-practices

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

SciPy Best Practices

SciPy 最佳实践

Expert guidelines for SciPy development, focusing on scientific computing, optimization, signal processing, and statistical analysis.
针对SciPy开发的专家指南,聚焦于科学计算、优化、信号处理与统计分析。

Code Style and Structure

代码风格与结构

  • Write concise, technical Python code with accurate SciPy examples
  • Prioritize numerical accuracy and computational efficiency
  • Use functional programming patterns for mathematical operations
  • Prefer vectorized operations over explicit loops
  • Use descriptive variable names reflecting scientific context
  • Follow PEP 8 style guidelines
  • 编写简洁、专业的Python代码,并附带准确的SciPy示例
  • 优先考虑数值准确性与计算效率
  • 对数学运算使用函数式编程模式
  • 优先使用向量化运算而非显式循环
  • 使用反映科学场景的描述性变量名
  • 遵循PEP 8风格指南

scipy.optimize - Optimization

scipy.optimize - 优化

  • Use
    scipy.optimize.minimize()
    for general-purpose optimization
  • Choose appropriate method based on problem characteristics:
    • 'BFGS'
      for smooth, unconstrained problems
    • 'L-BFGS-B'
      for bounded problems
    • 'SLSQP'
      for constrained optimization
    • 'Nelder-Mead'
      for non-differentiable functions
  • Provide gradients when available for faster convergence
  • Use
    scipy.optimize.curve_fit()
    for nonlinear least squares fitting
  • Use
    scipy.optimize.root()
    for finding roots of equations
  • 使用
    scipy.optimize.minimize()
    进行通用优化
  • 根据问题特性选择合适的方法:
    • 'BFGS'
      用于平滑、无约束问题
    • 'L-BFGS-B'
      用于有界问题
    • 'SLSQP'
      用于约束优化
    • 'Nelder-Mead'
      用于不可微函数
  • 若有梯度信息则提供,以加快收敛速度
  • 使用
    scipy.optimize.curve_fit()
    进行非线性最小二乘拟合
  • 使用
    scipy.optimize.root()
    求解方程的根

scipy.linalg - Linear Algebra

scipy.linalg - 线性代数

  • Prefer
    scipy.linalg
    over
    numpy.linalg
    for additional functionality
  • Use
    scipy.linalg.solve()
    instead of computing matrix inverse
  • Leverage specialized solvers for structured matrices (banded, triangular)
  • Use
    scipy.linalg.lu_factor()
    and
    lu_solve()
    for multiple right-hand sides
  • Use sparse matrix solvers from
    scipy.sparse.linalg
    for large sparse systems
  • 优先使用
    scipy.linalg
    而非
    numpy.linalg
    ,以获得更多功能
  • 使用
    scipy.linalg.solve()
    而非计算矩阵逆
  • 针对结构化矩阵(带状、三角矩阵)使用专用求解器
  • 使用
    scipy.linalg.lu_factor()
    lu_solve()
    处理多右侧项问题
  • 针对大型稀疏系统,使用
    scipy.sparse.linalg
    中的稀疏矩阵求解器

scipy.stats - Statistics

scipy.stats - 统计

  • Use distribution objects for probability calculations
  • Leverage
    scipy.stats.describe()
    for summary statistics
  • Use hypothesis testing functions:
    ttest_ind()
    ,
    chi2_contingency()
    ,
    mannwhitneyu()
  • Generate random samples with
    .rvs()
    method on distributions
  • Use
    .fit()
    for parameter estimation from data
  • 使用分布对象进行概率计算
  • 利用
    scipy.stats.describe()
    生成汇总统计信息
  • 使用假设检验函数:
    ttest_ind()
    chi2_contingency()
    mannwhitneyu()
  • 调用分布对象的
    .rvs()
    方法生成随机样本
  • 使用
    .fit()
    从数据中估计参数

scipy.interpolate - Interpolation

scipy.interpolate - 插值

  • Use
    scipy.interpolate.interp1d()
    for 1D interpolation
  • Use
    scipy.interpolate.griddata()
    for scattered data interpolation
  • Choose appropriate interpolation method: 'linear', 'cubic', 'nearest'
  • Use spline functions for smooth interpolation:
    UnivariateSpline
    ,
    BSpline
  • Consider
    RegularGridInterpolator
    for regular grid data
  • 使用
    scipy.interpolate.interp1d()
    进行一维插值
  • 使用
    scipy.interpolate.griddata()
    进行散点数据插值
  • 选择合适的插值方法:'linear'、'cubic'、'nearest'
  • 使用样条函数实现平滑插值:
    UnivariateSpline
    BSpline
  • 针对规则网格数据,考虑使用
    RegularGridInterpolator

scipy.integrate - Integration

scipy.integrate - 积分

  • Use
    scipy.integrate.quad()
    for single integrals
  • Use
    scipy.integrate.dblquad()
    ,
    tplquad()
    for multiple integrals
  • Use
    scipy.integrate.solve_ivp()
    for ordinary differential equations
  • Choose appropriate ODE method: 'RK45', 'BDF', 'LSODA'
  • Provide Jacobian for stiff systems to improve performance
  • 使用
    scipy.integrate.quad()
    进行单积分
  • 使用
    scipy.integrate.dblquad()
    tplquad()
    进行多重积分
  • 使用
    scipy.integrate.solve_ivp()
    求解常微分方程
  • 选择合适的ODE方法:'RK45'、'BDF'、'LSODA'
  • 针对刚性系统提供雅可比矩阵以提升性能

scipy.signal - Signal Processing

scipy.signal - 信号处理

  • Use
    scipy.signal.butter()
    ,
    cheby1()
    ,
    ellip()
    for filter design
  • Apply filters with
    scipy.signal.filtfilt()
    for zero-phase filtering
  • Use
    scipy.signal.welch()
    for power spectral density estimation
  • Use
    scipy.signal.find_peaks()
    for peak detection
  • Leverage
    scipy.signal.convolve()
    and
    correlate()
    for convolution
  • 使用
    scipy.signal.butter()
    cheby1()
    ellip()
    进行滤波器设计
  • 使用
    scipy.signal.filtfilt()
    应用滤波器以实现零相位滤波
  • 使用
    scipy.signal.welch()
    估计功率谱密度
  • 使用
    scipy.signal.find_peaks()
    进行峰值检测
  • 利用
    scipy.signal.convolve()
    correlate()
    进行卷积运算

scipy.sparse - Sparse Matrices

scipy.sparse - 稀疏矩阵

  • Use appropriate sparse format for your use case:
    • csr_matrix
      for efficient row slicing and matrix-vector products
    • csc_matrix
      for efficient column slicing
    • coo_matrix
      for constructing sparse matrices
    • lil_matrix
      for incremental construction
  • Convert to optimal format before operations
  • Use
    scipy.sparse.linalg
    solvers for sparse linear systems
  • 根据使用场景选择合适的稀疏格式:
    • csr_matrix
      用于高效行切片和矩阵-向量乘积
    • csc_matrix
      用于高效列切片
    • coo_matrix
      用于构建稀疏矩阵
    • lil_matrix
      用于增量构建矩阵
  • 在执行运算前转换为最优格式
  • 使用
    scipy.sparse.linalg
    求解器处理稀疏线性系统

Performance Optimization

性能优化

  • Use appropriate data types (
    float64
    for precision,
    float32
    for memory)
  • Leverage BLAS/LAPACK through SciPy for optimized linear algebra
  • Pre-allocate arrays when possible
  • Use in-place operations when available
  • 使用合适的数据类型(
    float64
    保证精度,
    float32
    节省内存)
  • 通过SciPy利用BLAS/LAPACK实现优化的线性代数运算
  • 尽可能预先分配数组
  • 尽可能使用原地操作

Error Handling and Validation

错误处理与验证

  • Check convergence status of optimization routines
  • Validate numerical results for reasonableness
  • Handle ill-conditioned problems gracefully
  • Use appropriate tolerances for convergence criteria
  • 检查优化例程的收敛状态
  • 验证数值结果的合理性
  • 优雅处理病态问题
  • 为收敛准则设置合适的容差

Testing Scientific Code

科学代码测试

  • Test against known analytical solutions
  • Use
    np.testing.assert_allclose()
    for numerical comparisons
  • Test edge cases and boundary conditions
  • Verify conservation laws and invariants
  • 对照已知的解析解进行测试
  • 使用
    np.testing.assert_allclose()
    进行数值比较
  • 测试边缘情况与边界条件
  • 验证守恒律与不变量

Key Conventions

关键约定

  • Import specific submodules:
    from scipy import optimize, stats, linalg
  • Use
    snake_case
    for variables and functions
  • Document algorithm choices and parameters
  • Include convergence diagnostics in output
  • 导入特定子模块:
    from scipy import optimize, stats, linalg
  • 变量和函数使用
    snake_case
    命名法
  • 记录算法选择与参数
  • 在输出中包含收敛诊断信息