Python中矩阵值的数值积分

时间:2019-07-19 01:56:18

标签: python matrix scipy integration

我正在尝试在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放在积分的前面。

3 个答案:

答案 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])

这比所有其他答案快了