Python 函数返回numpy数组时的scipy.integrate.quad

Python 函数返回numpy数组时的scipy.integrate.quad,python,numpy,scipy,Python,Numpy,Scipy,我有一个函数返回我需要集成的numpy数组。我想使用scipy.integrate.dblquad,但它需要函数返回浮点值 我试图在dblquad上使用numpy.vectorize,但它不起作用。经过一番思考,我意识到这种方法的问题在于,向量化的dblquad需要函数向量,而不是返回向量的函数 我想用任何方法来解决这个问题,除了拆分数组和逐案集成(已经这样做了,代码一团糟)。我想到的第一件事是将返回数组的函数转换为返回等价函数的数组,但我不知道这是否可行 我会放一些说明性的代码。下面,x和y是

我有一个函数返回我需要集成的numpy数组。我想使用
scipy.integrate.dblquad
,但它需要函数返回浮点值

我试图在
dblquad
上使用
numpy.vectorize
,但它不起作用。经过一番思考,我意识到这种方法的问题在于,向量化的
dblquad
需要函数向量,而不是返回向量的函数

我想用任何方法来解决这个问题,除了拆分数组和逐案集成(已经这样做了,代码一团糟)。我想到的第一件事是将返回数组的函数转换为返回等价函数的数组,但我不知道这是否可行

我会放一些说明性的代码。下面,
x
y
是numpy数组,
a
和b是浮点数

我想做什么

x = np.random.rand((3,3))
y = np.random.rand((3,3))
a = 1.5
b = 3.0
I = dblquad(foo, 0, 1, lambda x: 0, lambda x: 1, args=(x,y))
获取一个数组
I
,其形状
(3,3)
,其条目
I[I][j]

foo(a,b,x[i][j],y[i][j])
,前两个参数超过0和1


我相信有一种聪明的方法可以用
np.vectorize
,但我想不出任何方法。

这对我来说很有用:

f = lambda x,y,a,b: np.exp(a*x+b*y)
dblquad(f, 0, 1, lambda x:0, lambda x:1, args=(1.0,1.0), epsabs=1.49e-08, epsrel=1.49e-08)
f-2D函数,x,y为变量a,b-仅为参数。所以我们在dblquad函数中将x从0积分到1秒和第三个arg,然后在dblquad函数中将y从0积分到第四个arg和第五个arg,但是以函数的形式;然后以args=(1.0,1.0)的形式传递a,b。剩下的是默认的东西

如果要在某些值范围内改变参数,可以执行以下操作:

[dblquad(f, 0, 1, lambda x:0, lambda x:1, args=(a,b)) for a in range(2) for b in range(2)]
这将得到一个平面数组,其结果(积分)对应于(a,b):

您还可以执行以下操作:

  [[dblquad(f, 0, 1, lambda x:0, lambda x:1, args=(a,b)) for a in range(2)] for b in range(2)]
这将产生对应于(a,b)的2D结构化结果列表:


我的意思是x和y作为数组,所以foo值也是一个数组。用x=np.ones((2,2))和y=np.ones((2,2))试试你的建议。这样四元函数就不起作用了,这就是我想要的。你是对x,y还是a,b进行积分?[dblquad(f,0,1,lambda x:0,lambda x:1,args=(a,b)),用于范围(2)中的a,用于范围(2)中的b]-列出改变参数的共同理解。。。这不是你想要的吗?积分是在a和b之上的。x和y是数组。f=lambda,b,x,y:np.exp(ax+by);[dblquad(f,0,1,lambda var:0,lambda var:1,args=(x,y))用于np.arange(3)中的x]
 [(0, 0), (0, 1), (1, 0), (1, 1)]
  [[dblquad(f, 0, 1, lambda x:0, lambda x:1, args=(a,b)) for a in range(2)] for b in range(2)]
  [[(0, 0), (0, 1)], [(1, 0), (1, 1)]]