You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取scipy.integrate.quad返回结果中的有效积分值

批量提取quad积分有效结果的实现方案

问题背景

使用scipy.integrate.quad计算多上限数组的积分时,函数默认返回二元元组:第一个元素为有效积分计算结果,第二个元素为积分的绝对误差估计。当前代码直接存储了完整元组,需要提取所有元组的第一位有效结果,剔除误差项。
原有实现代码如下:

from scipy.integrate import quad
from typing import List

def integrand(z,alpha,beta,gamma):
    return (2**(-0.5 + 1/(2.*(1/(1 + z))**(3*gamma)))*3**(-0.5 + 3/(2.*(1/(1 + z))**(3*gamma)))*23**(1/(1 + z))**(-3*gamma)*np.exp(1 - (1/(1 + z))**(-3*gamma) - alpha/(2.*beta) + alpha/(2.*(1/(1 + z))**(3*gamma)*beta)))**(-1)


def multi_integrate(alpha,beta,gamma,lb:float, ub_ls:List[float]) -> List:
    results = []
    # loop through all upper bounds
    for ub in ub_ls:
        results.append(quad(integrand,lb,ub,args=(alpha,beta,gamma)))
    return results

lb = 0
ub_ls =z

def Hz_th(alpha,beta,gamma,z):
    return multi_integrate(alpha,beta,gamma, lb,ub_ls)

运行后返回结果为元组列表,格式如下:

[(0.00014626812936348427, 1.6239024498819118e-18),
 (0.000150015526635659, 1.6655069172217707e-18),
 (0.00015073611990008352, 1.6735071095573097e-18),
 (0.00015635608256829605, 1.7359012290751435e-18),
 (0.0001746488221728651, 1.938991435999794e-18)...

实现方法

有两种可行的提取方式,优先选择第一种,在计算阶段直接过滤无效数据,减少内存占用:

  • 方法1:在循环计算时直接解包quad返回的元组,用下划线承接不需要的误差项,仅存储有效积分值。
    注意原代码缺少numpy导入,且ub_ls = z的定义位置不合理,修正后完整代码如下:
    import numpy as np
    from scipy.integrate import quad
    from typing import List
    
    def integrand(z,alpha,beta,gamma):
        return (2**(-0.5 + 1/(2.*(1/(1 + z))**(3*gamma)))*3**(-0.5 + 3/(2.*(1/(1 + z))**(3*gamma)))*23**(1/(1 + z))**(-3*gamma)*np.exp(1 - (1/(1 + z))**(-3*gamma) - alpha/(2.*beta) + alpha/(2.*(1/(1 + z))**(3*gamma)*beta)))**(-1)
    
    
    def multi_integrate(alpha,beta,gamma,lb:float, ub_ls:List[float]) -> List:
        results = []
        for ub in ub_ls:
            # 解包返回元组,忽略误差项
            integral_res, _ = quad(integrand,lb,ub,args=(alpha,beta,gamma))
            results.append(integral_res)
        return results
    
    lb = 0
    
    def Hz_th(alpha,beta,gamma,z):
        return multi_integrate(alpha,beta,gamma, lb, z)
    
  • 方法2:如果已经生成了元组格式的结果列表,可通过列表推导式批量提取第一位元素:
    # raw_results为已存储的元组列表
    valid_results = [res[0] for res in raw_results]
    

效果

处理后返回的结果为纯数值列表,格式如下:

[0.00014626812936348427,
 0.000150015526635659,
 0.00015073611990008352,
 0.00015635608256829605,
 0.0001746488221728651,
 ...]

内容的提问来源于stack exchange,提问作者AlexSok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:42:16