如何通过for循环将多次计算的mU值存入数组而非仅保留最终标量?
如何将循环中计算的mU值全部存入数组
现有如下Python代码,用于计算不同温度T对应的mU值,目前在循环内可以打印每个T对应的mU,但循环外仅能获取最后一次循环的结果,希望将所有mU值存入数组中:
import numpy as np import matplotlib.pyplot as plt import scipy c=299792458 #speed of light in nanometers per second h=6.62607015e-34 #plank's constant in m^2 kg per s kB=1.380649e-23 #Boltzmann's constant in m^2 kg per s^2 K π=np.pi def F(λ,n): return ((2*π*h*c**2)/λ**5)*(1/(np.exp((h*c)/(λ*kB*n))-1)) def integrand0(λ): return F(λ,10800) T=np.linspace(3000,12000,46) import scipy.integrate as integrate for n in T: def integrand(λ): return F(λ,n) mU=-2.5*(np.log10(integrate.quad(integrand,325e-9,395e-9))-np.log10(integrate.quad(integrand0,325e-9,395e-9))) print('T=',n,'mU=',mU[0]) print(mU[0])
解决方法
核心逻辑是提前初始化一个容器(列表或numpy数组),每次循环计算出mU值后,将其存入容器中。同时可以优化重复计算的部分提升效率,修改后的代码如下:
import numpy as np import matplotlib.pyplot as plt import scipy import scipy.integrate as integrate c=299792458 #speed of light in nanometers per second h=6.62607015e-34 #plank's constant in m^2 kg per s kB=1.380649e-23 #Boltzmann's constant in m^2 kg per s^2 K π=np.pi def F(λ,n): return ((2*π*h*c**2)/λ**5)*(1/(np.exp((h*c)/(λ*kB*n))-1)) def integrand0(λ): return F(λ,10800) T=np.linspace(3000,12000,46) # 初始化空列表存储所有mU结果 mU_results = [] # 预计算integrand0的积分值,避免循环内重复计算 integral_0 = integrate.quad(integrand0, 325e-9, 395e-9)[0] for n in T: def integrand(λ): return F(λ,n) integral_n = integrate.quad(integrand, 325e-9, 395e-9)[0] # 直接计算标量mU,避免后续索引操作 mU = -2.5 * (np.log10(integral_n) - np.log10(integral_0)) print('T=',n,'mU=',mU) # 将当前结果存入列表 mU_results.append(mU) # 可选:将列表转换为numpy数组,方便后续数值操作 mU_array = np.array(mU_results) # 循环外可直接调用所有结果 print("所有mU值数组:", mU_array)
优化说明
- 提前计算
integrand0的积分结果,减少循环内的重复计算,大幅提升代码运行速度 - 直接提取
integrate.quad返回的第一个元素(积分标量值),简化后续计算逻辑 - 用列表存储结果,循环结束后可按需转换为numpy数组,适配不同场景需求
内容的提问来源于stack exchange,提问作者Ruben Martinez
相关产品推荐
相关产品推荐

