用isympy/ipython自省:
In [28]: lamb2??
Signature: lamb2(t)
Docstring:
Created with lambdify. Signature:
func(arg_0)
Expression:
t
Source code:
def _lambdifygenerated(t):
return (t)
第一个:
In [29]: lamb1??
Signature: lamb1(t)
Docstring:
Created with lambdify. Signature:
func(arg_0)
Expression:
1
Source code:
def _lambdifygenerated(t):
return (1)
所以一个返回输入参数;另一个只返回常量,而不管输入。 lambdify 进行了从 sympy 到 numpy Python 的相当简单的词法转换。
编辑
把你的函数放在sp.Matrix:
In [55]: lamb3 = lambdify('t',Matrix([f1,f2]))
In [56]: lamb3??
...
def _lambdifygenerated(t):
return (array([[1], [t]]))
...
In [57]: lamb3(np.arange(3))
Out[57]:
array([[1],
[array([0, 1, 2])]], dtype=object)
所以这会返回一个 numpy 数组;但由于形状的混合,结果是对象 dtype,而不是 2d。
我们可以通过直接的数组生成来看到这一点:
In [53]: np.array([[1],[1,2,3]])
Out[53]: array([list([1]), list([1, 2, 3])], dtype=object)
In [54]: np.array([np.ones(3,int),[1,2,3]])
Out[54]:
array([[1, 1, 1],
[1, 2, 3]])
sympy 和 np.array 都不会尝试“广播”该常量。有 numpy 结构可以做到这一点,例如乘法和加法,但这个简单的 sympy 函数和 lambdify 不能。
编辑
frompyfunc 是一种将一个(或多个)数组传递给仅适用于标量输入的函数的方法。虽然lamb2 与数组输入一起使用,但您对lamb1 的情况不满意,或者可能是lamb3。
In [60]: np.frompyfunc(lamb1,1,1)([1,2,3])
Out[60]: array([1, 1, 1], dtype=object)
In [61]: np.frompyfunc(lamb2,1,1)([1,2,3])
Out[61]: array([1, 2, 3], dtype=object)
这个 [61] 比简单的 lamb2([1,2,3]) 慢,因为它有效地迭代。
In [62]: np.frompyfunc(lamb3,1,1)([1,2,3])
Out[62]:
array([array([[1],
[1]]), array([[1],
[2]]),
array([[1],
[3]])], dtype=object)
在这种 Matrix 案例中,结果是一个数组数组。但是由于形状匹配,它们可以组合成一个数组(以各种方式):
In [66]: np.concatenate(_62, axis=1)
Out[66]:
array([[1, 1, 1],
[1, 2, 3]])