扩展 python 函数来处理 sympy 符号

Extend python function to handle sympy symbols

给定一个为数值编写的现有函数,Sympy 是否有建议的方法来扩展它处理符号?例如:

import numpy as np
def foo(ax, ay, az):
  A = np.matrix([[1. ,    ax,          0],
                 [0  , 1./ay,          0],
                 [0  ,     0, np.cos(az)]])
  return A
foo(1, 2, 3)

# We want this to work too:
import sympy as spy
ax, ay, az = spy.symbols(('ax', 'ay', 'az'))
foo(ax, ay, az)

如何扩展 foo() 来处理 sympy 符号 ax, ay, az,从而 return 一个符号矩阵 A? sympy 是否有任何实用程序可以帮助解决这个问题?

不幸的是,您无法在 numpy 函数中处理 sympy 符号。一个肮脏的解决方案是检查变量的类型并决定使用哪个函数。

import numpy as np
import sympy as spy

def foo(ax, ay, az):
  A = np.matrix([[1.,    ax, 0                                                    ],
                 [0 , 1./ay, 0                                                    ],
                 [0 , 0    , spy.cos(az) if type(az) is spy.Symbol else np.cos(az)]])
  return A

print foo(1, 2, 3)

ax, ay, az = spy.symbols(('ax', 'ay', 'az'))
print foo(ax, ay, az)
>>>
[[ 1.         1.         0.       ]
 [ 0.         0.5        0.       ]
 [ 0.         0.        -0.9899925]]
[[1.0 ax 0]
 [0 1.0/ay 0]
 [0 0 cos(az)]]