我正在应用一个积分函数,使用scipy.integrate到两个2Darray.以下是示例:

from scipy import integrate
import numpy as np

def integrate_lno2(top, bottom, peak_height, peak_width):
    return integrate.quad(lambda x: np.exp(-np.power(x - peak_height, 2)/(2*np.power(peak_width, 2))), top, bottom)[0]

# change row and col to test speed
row = 100; col = 100; peak_height=300; peak_width=60

top = np.linspace(100, 200, row*col).reshape(row, col)
bottom = np.linspace(800, 900, row*col).reshape(row, col)

res = np.zeros((row, col))

for i in range(row):
    for j in range(col):
        res[i, j] = integrate_lno2(top[i, j], bottom[i, j], peak_height, peak_width)

如果二维数组的形状增加,则for循环可能会变慢.我找到了Nuba integrand example,但它不接受上限和下限.

推荐答案

与前面的this个答案一样,您可以使用Numba来加速lambda调用,因为Numpy的开销很大(Numpy没有优化为在scalar上操作,所以执行起来非常慢).更好的是:您可以告诉Numba生成一个C函数,该函数可以直接从Scipy调用,开销非常小(因为它几乎完全消除了缓慢的CPython解释器的开销).您还可以预先计算变量的除法,并将其转换为乘法(更快).

以下是生成的代码:

import numba as nb
import numpy as np
import scipy as sp

factor = -1.0 / (2 * np.power(peak_width, 2))

# change row and col to test speed
row = 100; col = 100; peak_height=300; peak_width=60

@nb.cfunc('float64(float64)')
def compute_numba(x):
    return np.exp(np.power(x - peak_height, 2) * factor)

compute_c = sp.LowLevelCallable(compute_numba.ctypes)

def integrate_lno2(top, bottom):
    return sp.integrate.quad(compute_c, top, bottom)[0]

top = np.linspace(100, 200, row*col).reshape(row, col)
bottom = np.linspace(800, 900, row*col).reshape(row, col)

res = np.zeros((row, col))

for i in range(row):
    for j in range(col):
        res[i, j] = integrate_lno2(top[i, j], bottom[i, j])

在我的机器上,计算循环是roughly 100 times faster.

Python相关问答推荐

Pandas 密集排名具有相同值,按顺序排列

在Python中,如何初始化集合列表脚本的输出

使用unmanagedexports从Python调用的c#DLC

如何在telegram 机器人中发送音频?

socket.gaierror:[Errno -2]名称或服务未知|Firebase x Raspberry Pi

在两极中实施频率编码

使用Beautiful Soup获取第二个srcset属性

在Python中管理多个OpenGVBO和VAO实例

将行从一个DF添加到另一个DF

如何根据情况丢弃大Pandas 的前n行,使大Pandas 的其余部分完好无损

Python中的负前瞻性regex遇到麻烦

使用pandas、matplotlib和Yearbox绘制时显示错误的年份

返回nxon矩阵的diag元素,而不使用for循环

如何自动抓取以下CSV

Pystata:从Python并行运行stata实例

如何比较numPy数组中的两个图像以获取它们不同的像素

删除字符串中第一次出现单词后的所有内容

try 将一行连接到Tensorflow中的矩阵

如何在Python中使用另一个数据框更改列值(列表)

下三角形掩码与seaborn clustermap bug