首页 文章

同情表达的numpy数组中某些符号的数值计算

提问于
浏览
2

问题

我正在使用任意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 具有相同尺寸的新数组,但已将其指定的变量替换为新值 . 例如,如果我想用2替换 b ,则新数组应如下所示:

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/但我甚至可以这样做 . 任何帮助将不胜感激 .

2 回答

  • 1

    只需使用 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]])
    
  • 3

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

相关问题