在Python中设置积分区域进行数值积分

1 投票
1 回答
640 浏览
提问于 2025-04-18 06:24

我想对一个名为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])

你也可以考虑通过先在最长的维度上进行积分,来提高处理大型复杂数组的效率。不过,如果不在最后一个维度上进行积分(这是最快的方式),可能会带来一些性能上的损失。我自己没有深入研究这些细节。

撰写回答