gpt4 book ai didi

python - 加速 sympy-lamdified 和矢量化函数

转载 作者:太空狗 更新时间:2023-10-30 01:01:27 30 4
gpt4 key购买 nike

我正在使用 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 这样的简单表达式,此函数不会返回数组。有没有办法解决这个问题,这不是某种错误或至少是不一致的设计吗?

最佳答案

lambdify 返回常量的单个值,因为不涉及 numpy 函数。这是因为 lambdify 的工作方式(参见 https://stackoverflow.com/a/25514007/161801 )。

但这通常不是问题,因为常量会在您将其用于数组的任何操作中自动广播到正确的形状。另一方面,如果您显式地使用具有相同常量的数组,则效率会低得多,因为您会多次计算相同的操作。

关于python - 加速 sympy-lamdified 和矢量化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25803573/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com