如何实现双参数逐元素的NumPy.piecewise?布尔索引方案是否可行?
双变量分段函数的NumPy实现疑问
我有工程背景,熟练使用VBA,刚接触Python与NumPy,目前正用其分析包含复杂间断函数(激波、转捩流)的气体动力学问题。现有一个双变量分段连续函数:
f(Re, r) = fL(Re, r),当Re<2000(对所有r)
f(Re, r) = fT(Re, r),当Re≥2000(对所有r)
我已测试多种计算f的方案,包括循环、向量化标量函数、numpy.where()、numpy.select()、numpy.piecewise()及多种布尔索引形式。numpy.piecewise()看似最优雅,但不知如何实现双参数的逐元素运算。同时想了解下方的布尔索引方案在数组规模较大时是否合理,相关测试代码如下:
import numpy as np def fL(Re, r): return 16.0/Re def fT(Re,r): return ((-1.8*np.log10((r/3.7)**1.11 + 6.9/Re))**-2.0)/4.0 Re = np.logspace(3., 7., 5) # 当r是标量时可以正常运行 r = 0.0001 def f0(Re, r): return np.piecewise(Re, [Re<2000.0, Re>=2000.0], [fL, fT], r) print('\n Re: ', Re) print(' r: ', r) print('f0(Re, r): ', f0(Re, r)) # 这种方式支持Re和r均为数组时的逐元素运算(正是我需要的) r = np.full_like(Re, 0.0001) def f1(Re, r): fct = np.zeros(len(Re)) fct[Re < 2000.0] = fL(Re[Re < 2000.0], r[Re < 2000.0]) fct[Re >= 2000.0] = f0(Re[Re >= 2000.0], r[Re >= 2000.0]) return fct print('\n Re: ', Re) print(' r: ', r) print('f1(Re, r): ', f1(Re, r)) # 但这种方式无法支持数组形式的r的逐元素运算 print('\n Re: ', Re) print(' r: ', r) print('f(Re, r): ', f0(Re, r))
内容的提问来源于stack exchange,提问作者Murray Anderson
相关产品推荐
相关产品推荐

