如何正确计算数组中每条y=f(x)曲线与X轴间的面积?
解决numpy.trapz计算多条曲线面积的问题
我明白你的问题了——你现在有形状为(22, 2)的X和Y数组,相当于2条独立的曲线(每一列对应一条曲线,每条曲线有22个采样点),但直接用np.trapz(y, x)得到的结果不符合预期,因为numpy的trapz默认积分的轴不对。
问题原因
默认情况下,np.trapz会沿着**最后一个轴(axis=-1)**计算积分。对于(22,2)的数组来说,这意味着它会对每一行的2个元素做积分,最后得到一个形状为(22,)的数组,这显然不是你要的每条曲线(列)的单值面积。
解决方案
你只需要指定axis=0,告诉trapz沿着行的方向(也就是每个曲线的采样点维度)进行积分,这样就能得到每条曲线对应的单个面积值了:
import numpy as np # 假设你的X和Y是形状(22,2)的数组 area = np.trapz(Y, X, axis=0)
这样得到的area会是一个形状为(2,)的数组,其中第一个元素对应第一条曲线(Y的第0列)与X轴围成的面积,第二个元素对应第二条曲线(Y的第1列)的面积。
验证示例
举个简单的测试例子,用两条已知面积的直线验证:
# 第一条曲线是y=x,从x=0到x=21(22个点),面积应为(21*21)/2=220.5 # 第二条曲线是y=2x,面积应为220.5*2=441 X = np.arange(22).reshape(22, 1) X = np.hstack([X, X]) # 构造形状(22,2)的X数组 Y = X * np.array([1, 2]) # 构造两条曲线的Y数组 area = np.trapz(Y, X, axis=0) print(area) # 输出 [220.5 441. ],与预期完全一致
内容的提问来源于stack exchange,提问作者Krystal
相关产品推荐
相关产品推荐

