【发布时间】:2019-11-05 17:19:01
【问题描述】:
我有很多数据要整合,我想找到一种只用矩阵来完成这一切的方法,并且愿意在准确性上做出妥协以提高性能。我的想法是这样的:
import numpy
import scipy
a = np.array([1,2,3])
def func(x):
return x**2 + x
def func2(x):
global a
return a*x
def integrand(x):
return func(x)*func2(x)
integrated = quad(integrand, 0, 1)
所以我试图整合来自integrand的数组中的每个元素。
我知道有可能像这样使用numpy.vectorize():
integrated = numpy.vectorize(scipy.integrate.quad)(integrand, 0, 1)
但我无法让它工作。有没有办法在python中做到这一点?
解决方案
现在我学到了更多的python,如果有人碰巧稳定它并且有同样的问题,我可以回答这个问题。这样做的方法是编写函数,就好像它们将采用标量值而不是向量作为输入一样。所以按照我上面的代码,我们会得到类似
import numpy as np
import scipy.integrate.quad
a = np.array([1, 2, 3]) # arbitrary array, can be any size
def func(x):
return x**2 + x
def func2(x, a):
return a*x
def integrand(x, a):
return func(x)*func2(x, a)
def integrated(a):
integrated, tmp = scipy.integrate.quad(integrand, 0, 1, args = (a))
return integrated
def vectorizeInt():
global a
integrateArray = []
for i in range(len(a)):
integrate = integrated(a[i])
integrateArray.append(integrate)
return integrateArray
并不是您要积分的变量必须是函数的第一个输入。这是 scipy.integrate.quad 所必需的。如果您正在集成一个方法,它是典型的self 之后的第二个参数(即x 集成在def integrand(self, x, a): 中)。此外,args = (a) 是告诉quad 函数integrand 中a 的值所必需的。如果integrand 有很多参数,比如def integrand(x, a, b, c, d):,您只需将参数按顺序排列在args 中。那就是args = (a, b, c, d)。
【问题讨论】: