使用NumPy数组对Sympy表达式中某些符号进行数字计算

4

问题

我正在处理一个任意大小为 MxN 的 numpy 矩阵,其中每个元素都是 sympy 表达式,可能具有不同的符号。为了进行可视化,让我们使用以下矩阵 test

import sympy as sp
import numpy as np

a,b,c=sp.symbols('a b c');
test=np.array([[a**2,a+b],[a*c+b,b/c]]);

运行时,test 程序的外观如下:

In [25]: test
Out[25]: 
array([[a**2, a + b],
       [a*c + b, b/c]], dtype=object)

我希望能够将该数组中的一个变量用数字替换,并返回一个与test具有相同维度但已将指定变量替换为其新值的新数组。例如,如果我想将b替换为2,则新数组应如下所示:
array([[a**2, a + 2],
       [a*c + 2, 2/c]], dtype=object)

尝试解决方案

我首先尝试使用sympy函数subs,但是我收到了以下错误:

test.subs({b:2})
Traceback (most recent call last):

  File "<ipython-input-29-a9a04d63af37>", line 1, in <module>
    test.subs({b:2})

AttributeError: 'numpy.ndarray' object has no attribute 'subs'

我考虑使用lambdify,但我认为它返回的是数值lambda表达式,这不是我想要的。我需要一个新的符号表达式,只是不再依赖于b。我在Wolfram Mathematica文档中找到了一些关于模式匹配的文献,似乎正是我所需要的http://www.wolfram.com/language/fast-introduction-for-programmers/en/patterns/,但我不知道如何在Python中实现这一点,甚至不知道是否可能实现。非常感谢任何帮助。


使用 sympy.Matrix 构建符号矩阵(元素为 sympy 表达式),而不是 numpy.array。如果您将其定义为 test,则 subs 方法可以正常工作。 - Stelios
谢谢,这对我很有用。将我的表达式放在numpy数组中的目的是保持数学功能,但在需要进行替换之前,我会考虑将其转换为sympy矩阵。 - Peter Carniglia
1
我不建议将sympy和numpy的函数结合起来使用。尝试仅使用sympy工具执行符号计算。完成后,如果需要进行快速数字计算,请使用sympy.lambdify将您的sympy结果转换为numpy。 - Stelios
2个回答

6

只需使用sympy。至少在替换方面不需要numpy

In [117]: import sympy
In [118]: a,b,c=sympy.symbols('a b c')

In [120]: M=sympy.Matrix([[a**2, a+b],[a*c+b, b/c]])
In [121]: M
Out[121]: 
Matrix([
[   a**2, a + b],
[a*c + b,   b/c]])

In [123]: M.subs({b:2})
Out[123]: 
Matrix([
[   a**2, a + 2],
[a*c + 2,   2/c]])

谢谢提供这个示例!我将把它标记为已接受的答案,因为它最接近我的要求。 - Peter Carniglia

1

数组不是表达式,因此它没有subs方法


尝试提供替代方案,并告诉她情况的限制。 - JoshKopen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接