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

如何实现双参数逐元素的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:19:54