我正在尝试在Python中集成一些矩阵条目。我想避免循环,因为我的任务包括1 Mio仿真。我正在寻找可以有效解决我的问题的规范。
我收到以下错误:只有大小为1的数组可以转换为Python标量
import numpy as np
import scipy as sp
from scipy import integrate
import numpy.random as npr
import scipy.stats as scs
from scipy import integrate
n = 1000
m = 30
x = npr.standard_normal([n,m])
integrand = lambda k: k* x**2
integrate.quad(integrand, 0,100)
这是我的案例的简化示例。我有多个嵌套函数,因此我不能简单地将x放在积分的前面。
答案 0 :(得分:1)
那么您可能要为此使用并行执行。只要您只想执行integrate.quad 30000000次,这应该很容易。只需将您的工作量分成小包,然后分配给线程池即可。当然,提速仅限于您PC中具有的内核数量。我不是python程序员,但这应该是可能的。您还可以在Quad函数中增加epsabs和epsrel参数,具体取决于实现方式,这也可以加快编程速度。当然,您得到的结果会不太精确,但这可能没问题,具体取决于您的问题。
import threading
from scipy import integrate
import numpy.random as npr
n = 2
m = 3
x = npr.standard_normal([n,m])
def f(a):
for j in range(m):
integrand = lambda k: k * x[a,j]**2
i =integrate.quad(integrand, 0, 100)
print(i) ##write it to result array
for i in range(n):
threading.Thread(target=f(i)).start();
##better split it up even more and give it to a threadpool to avoid
##overhead because of thread init
答案 1 :(得分:0)
这可能不是理想的解决方案,但应该会有所帮助。您可以使用numpy.vectorize
。甚至医生说:提供向量化功能主要是为了方便,而不是为了提高性能。该实现本质上是一个for循环。但是,您提供的简单示例中的%timeit却显示出2.3倍的加速。
实现是
from scipy import integrate
from numpy import vectorize
import numpy.random as npr
n = 1000
m = 30
x = npr.standard_normal([n,m])
def g(x):
integrand = lambda k: k * x**2
return integrate.quad(integrand, 0, 100)
vg = vectorize(g)
res = vg(x)
答案 2 :(得分:0)
quadpy(属于我的项目)确实进行了矢量正交运算:
import numpy
import numpy.random as npr
import quadpy
x = npr.standard_normal([1000, 30])
def integrand(k):
return numpy.multiply.outer(x ** 2, k)
scheme = quadpy.line_segment.gauss_legendre(10)
val = scheme.integrate(integrand, [0, 100])
这比所有其他答案快了 。