加速同情和矢量化功能

 归向大海_651 发布于 2022-12-21 16:59

我正在使用sympy为数值计算生成一些函数.因此,我将一个表达式lambdify,并将其与numpy数组一起使用.这是一个例子:

import numpy as np
import sympy as sp

def numpy_function():
    x, y, z = np.mgrid[0:1:40*1j, 0:1:40*1j, 0:1:40*1j]
    T   = (1 - np.cos(2*np.pi*x))*(1 - np.cos(2*np.pi*y))*np.sin(np.pi*z)*0.1
    return T

def sympy_function():
    x, y, z = sp.Symbol("x"), sp.Symbol("y"), sp.Symbol("z")
    T   = (1 - sp.cos(2*sp.pi*x))*(1 - sp.cos(2*sp.pi*y))*sp.sin(sp.pi*z)*0.1
    lambda_function = np.vectorize(sp.lambdify((x, y, z), T, "numpy"))
    x, y, z = np.mgrid[0:1:40*1j, 0:1:40*1j, 0:1:40*1j]
    T = lambda_function(x,y,z)
    return T

sympy版本和纯粹numpy版本之间的问题是速度即

In [3]: timeit test.numpy_function()  
100 loops, best of 3: 11.9 ms per loop

In [4]: timeit test.sympy_function()
1 loops, best of 3: 634 ms per loop

那么有没有办法更接近numpy版本的速度?我认为np.vectorize非常慢,但不知怎的,如果没有它,我的代码中的某些部分就无法运行.谢谢你的任何建议.

编辑:所以我找到了为什么vectorize函数是必要的,即:

In [35]: y = np.arange(10)

In [36]: f = sp.lambdify(x,sin(x),"numpy")

In [37]: f(y)
Out[37]: 
array([ 0.        ,  0.84147098,  0.90929743,  0.14112001, -0.7568025 ,
       -0.95892427, -0.2794155 ,  0.6569866 ,  0.98935825,  0.41211849])

这似乎工作正常但是:

In [38]: y = np.arange(10)

In [39]: f = sp.lambdify(x,1,"numpy")

In [40]: f(y)
Out[40]: 1

因此对于简单表达式,1 此函数不会返回数组.有没有办法解决这个问题,这不是某种错误或至少是不一致的设计?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有