Python/Numpy新手求高效计算双自变量气流数据及优化绘图方法
优化Numpy气流计算与批量绘图方案
针对你提到的手动逐个计算不同k值对应的流量、扩展性差的问题,我们可以利用Numpy的向量化运算和广播机制来简化代码,大幅提升大规模场景下的效率,同时让绘图逻辑更简洁。
核心优化思路
- 将
ks从列表转为Numpy数组,利用广播自动完成每个k值与所有dp_inWC元素的组合计算 - 用一个二维数组统一存储所有k值对应的流量结果,避免重复写计算语句
- 基于数组批量绘图,无需手动逐个调用
plot
优化后的完整代码
import numpy as np import matplotlib.pyplot as plt #------------------------------------------------------------------------- # Flow calculations #------------------------------------------------------------------------- # Input parameters ps = 14.4 # static pressure (psi) d = 47.25 # ID (inch) dp_inWC = np.linspace(0, 15, 100) # pressure head (inH2O) # Airflow calculation constants Fna = 0.0997 # Unit conversion factor for lbm/s Faa = 1.0 # Thermal expansion factor blck = 0.02856 # Probe blockage gam = 1.401 # Ratio of specific heats rho = 0.0729 # humid air density (lbm/ft3) # Gas expansion factor (vectorized calculation) Ya = 1 - (0.011332*(1-blck)**2 - 0.00342)*dp_inWC/(ps*gam) # Convert ks to Numpy array for vectorized operations ks = np.array([0.6748, 0.6615]) # K-factor of probe, add more values here as needed # Vectorized mass flow calculation: shape becomes (len(ks), len(dp_inWC)) m_dot = Fna * ks[:, np.newaxis] * d**2 * Faa * Ya * np.sqrt(rho*dp_inWC) #---------------------------------------------------------------------------- # Plots #---------------------------------------------------------------------------- fig1, ax1 = plt.subplots() # Set plot properties ax1.set_title('Delta Pressure vs Mass Flow Rate', color='tab:red', fontweight='bold') ax1.set_xlabel('dP (inH2O)') ax1.set_ylabel('Mass Flow (lbm/s)') # Batch plot all curves: transpose m_dot to match dp_inWC's shape lines = ax1.plot(dp_inWC, m_dot.T) # Add legends dynamically based on ks values ax1.legend(lines, [f'k={k:.4f}' for k in ks]) fig1.tight_layout() plt.show()
关键细节解释
- 广播机制的应用:
ks[:, np.newaxis]把一维的ks变成了列向量(形状(2,1)),这样和一维的Ya、sqrt(rho*dp_inWC)(形状(100,))运算时,Numpy会自动扩展维度,最终得到(2,100)的m_dot数组,每一行对应一个k值的全流量数据。 - 扩展性:如果后续需要增加更多k值,只需要在
ks数组里添加元素即可,计算和绘图代码完全不需要修改。 - 效率提升:Numpy的向量化运算底层用C实现,比手动循环Python代码快几十到上百倍,尤其当
ks元素数量多、dp_inWC规模大时优势更明显。 - 批量绘图:
ax1.plot(dp_inWC, m_dot.T)会自动为m_dot.T的每一列(对应一个k值)绘制一条曲线,配合动态生成的图例,代码非常简洁。
额外小技巧
如果需要对曲线样式做统一或个性化设置,可以在plot里添加参数,比如:
ax1.plot(dp_inWC, m_dot.T, linestyle='-', marker='.', markersize=3)
内容的提问来源于stack exchange,提问作者jb1225




