【发布时间】:2021-03-06 19:08:58
【问题描述】:
我有一个 Sympy 形式的表达式
exp = 0.5*y1**2 + 2*y1*y2 + 2.5*x5**2 + 5.0*x6**2 - 25.0*exp(2.0*I*x4)*exp(1.0*I*x5) - 25.0*exp(2.0*I*x4) + 100.0 - 25.0*exp(-2.0*I*x4) - 25.0*exp(-2.0*I*x4)*exp(-1.0*I*x5)
我想将上述表达式转换为使用变量作为参数的函数。此外,参数将稀疏 scipy csc 矩阵作为输入代替变量。所以,我用下面的把它转换成一个函数。
func = lambdify((y1,y2,x4,x5,x6),exp,"scipy")
虽然,此函数生成时没有任何错误,但该函数不适用于 csc 稀疏矩阵。它给出了以下错误:
from scipy import sparse
a = sparse.identity(12000,format="csc")
func(a,a,a,a,a) # just to test the output
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
~/.local/lib/python3.9/site-packages/scipy/sparse/base.py in __getattr__(self, attr)
686 else:
--> 687 raise AttributeError(attr + " not found")
688
AttributeError: exp not found
The above exception was the direct cause of the following exception:
TypeError Traceback (most recent call last)
<ipython-input-321-ee4555e1ca2e> in <module>
1 a = sparse.identity(21,format="csc")
----> 2 func(a,a)
<lambdifygenerated-23> in _lambdifygenerated(x2, n2)
1 def _lambdifygenerated(x2, n2):
----> 2 return (0.125*n2**2 - 25.0*exp(2.0*1j*x2) - 25.0*exp(-2.0*1j*x2))
~/.local/lib/python3.9/site-packages/scipy/_lib/deprecation.py in call(*args, **kwargs)
18 warnings.warn(msg, category=DeprecationWarning,
19 stacklevel=stacklevel)
---> 20 return fun(*args, **kwargs)
21 call.__doc__ = msg
22 return call
TypeError: loop of ufunc does not support argument 0 of type csc_matrix which has no callable exp method
这表明稀疏矩阵的指数未定义。因此,我尝试将 exp(I*x1) 替换为单独的变量,然后将其用作参数。但是,当我使用 subs 时,我得到以下结果。
$exp.subs(exp(I*x4),e4)
0.5*y1**2 + 2*y1*y2 + 2.5*x5**2 + 5.0*x6**2 - 25.0*e4**2.0*exp(1.0*I*x5) - 25.0*e4**2.0 + 100.0 - 25.0/e4**2.0 - 25.0/e4**2.0*exp(-1.0*I*x5)
上述结果的问题是指数的负幂被分母中的变量e4代替了。因此,相同的lambdify版本不适用于矩阵,因为矩阵的除法运算是未定义的。我尝试使用 replace 分别替换exp(1.0*I*x5) 和exp(-1.0*I*x5) 形式的术语,但这不适用于exp(2.0*I*x5) 等术语。
有什么办法可以解决这种情况吗?任何帮助将不胜感激。
编辑:修改上述答案的某些部分以包含可重现的示例。另外,我使用的是复数方阵,其大小可以大得多,例如 12000 x 12000。
谢谢!
【问题讨论】:
-
我没有看到您创建稀疏矩阵或在函数中使用它们! minimal reproducible example
-
参数的
shape是什么,是稀疏、密集还是标量? -
我添加了一个示例以使其更具重现性。此外,参数的形状都相同,但可能非常大,在某些情况下形状大于 12000x12000。