С 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.
edit
Помещение ваших функций в 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; но из-за сочетания форм результатом является объект типа d, а не 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 этого не делают.
edit
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]])