在Python中设置积分区域进行数值积分
我想对一个名为c的多维数组进行数值积分。
这个高维表面需要通过某些轴进行积分,并且每个轴的增量是特定的。
假设这些特定的轴是:
- x[1]
- x[2]
- x[d]
我写了一个可以在二维情况下计算的函数:
from numpy import*
import scipy.integrate as scint
def int2d(c,x,y):
g=[]
a=arange(0,size(y))
for i in a:
g.append(scint.simps(c[i],x))
return scint.simps(g,y)
这个函数可以正常工作。
我想知道如何把它扩展到多维输入数组上?
我需要这样做,因为我想计算某个直方图函数的超体积。
1 个回答
0
你可以使用递归的方法。
另外,来自 scipy.integrate.simps 的说明中提到,默认的计算方向是最后一个维度。
import numpy
import scipy.integrate
def intNd(c,axes):
''' c is the array
axes is a list of the corresponding coordinates
'''
assert len(c.shape) == len(axes)
assert all([c.shape[i] == axes[i].shape[0]
for i in range(len(axes))])
if len(axes) == 1:
return scipy.integrate.simps(c,axes[0])
else:
return intNd(scipy.integrate.simps(c,axes[-1]),axes[:-1])
你也可以考虑通过先在最长的维度上进行积分,来提高处理大型复杂数组的效率。不过,如果不在最后一个维度上进行积分(这是最快的方式),可能会带来一些性能上的损失。我自己没有深入研究这些细节。