在 sympy 表达式中使用矩阵乘法 @ 运算符

发布于 2025-01-12 06:28:40 字数 618 浏览 0 评论 0原文

如果我使用符号 a,b,c 制作一个 Sympy 表达式,如下所示,

import sympy as sm
import numpy as np
a,b,c = sm.symbols("a,b,c")
expr = 4*a + b*a + b*c + a*b*c

f = sm.lambdify((a,b,c), expr)
a_1 = np.random.rand(10,10)
b_1 = np.random.rand(10,10)
c_1 = np.random.rand(10,10)
f(a_1, b_1, c_1)

对我来说,问题是lambdaify 在 numpy 中使用 * ,其中只是逐个元素相乘,但我需要上述函数中的 matmul 或 @ 运算符。上面的代码只是一个示例,在我的一些用例中,表达式的使用变得很复杂。我尝试在 Sympy 中寻找实现此目的的方法,但 lambdify 不适用于此运算符。我想知道是否存在一个符号,其作用类似于 Sympy 中的乘法运算符矩阵,其中不需要矩阵大小规范,但我找不到任何符号。对我来说也很重要的是,我可以对 a、b 和 c 的不同大小选择的矩阵使用相同的函数。任何建议都会非常有帮助。谢谢!

If I make a Sympy expression with symbols a,b,c as follows

import sympy as sm
import numpy as np
a,b,c = sm.symbols("a,b,c")
expr = 4*a + b*a + b*c + a*b*c

f = sm.lambdify((a,b,c), expr)
a_1 = np.random.rand(10,10)
b_1 = np.random.rand(10,10)
c_1 = np.random.rand(10,10)
f(a_1, b_1, c_1)

The problem here for me, is that lambdify uses * in numpy which is just the element-by-element multiplication, but I need the matmul or @ operator in the above function. Above code is just an example, and in some of my use cases the expression becomes complicated to use. I tried to look for methods to achieve this in Sympy, but lambdify does not work with this operator. I was wondering whether a symbol existed which acts like a matrix for multiplication operators in Sympy, where the matrix size specification is not necessary, but I could not find any. It is also important for me that I can use the same function for matrices of different size choice of a, b and c. Any suggestion would be very helpful. Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦言归人 2025-01-19 06:28:40

带有lambdify的数组的正常用法是根据表达式中符号的许多值来计算标量表达式。如果您想使用数组作为矩阵并进行矩阵乘法,那么您的符号需要是 MatrixSymbol :

In [235]: A = MatrixSymbol('A', 2, 2)

In [236]: B = MatrixSymbol('B', 2, 2)

In [237]: f = lambdify((A, B), A*B)

In [238]: import inspect

In [239]: inspect.getsource(f)
Out[239]: 'def _lambdifygenerated(A, B):\n    return (A).dot(B)\n'

In [240]: print(inspect.getsource(f))
def _lambdifygenerated(A, B):
    return (A).dot(B)

In [241]: a = np.array([[1, 2], [3, 4]])

In [242]: f(a, a)
Out[242]: 
array([[ 7, 10],
       [15, 22]])

The normal usage of arrays with lambdify is to evaluate a scalar expression over many values of the symbols in the expression. If you want to use arrays as matrices and have matrix multiplication then your symbols need to be MatrixSymbol:

In [235]: A = MatrixSymbol('A', 2, 2)

In [236]: B = MatrixSymbol('B', 2, 2)

In [237]: f = lambdify((A, B), A*B)

In [238]: import inspect

In [239]: inspect.getsource(f)
Out[239]: 'def _lambdifygenerated(A, B):\n    return (A).dot(B)\n'

In [240]: print(inspect.getsource(f))
def _lambdifygenerated(A, B):
    return (A).dot(B)

In [241]: a = np.array([[1, 2], [3, 4]])

In [242]: f(a, a)
Out[242]: 
array([[ 7, 10],
       [15, 22]])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文