Python - продукт Dot для матриц не работает при использовании sympy и lambdify - PullRequest
0 голосов
/ 14 декабря 2018

Я реализую поток обработки данных в Python.Я стараюсь максимально использовать символические вычисления (sympy и numpy), чтобы иметь четкую документацию в соответствии с кодом.Поэтому, когда я пытаюсь получить скалярное произведение и использовать его для реальных матриц (с помощью lambdify), я получаю что-то еще:

import numpy as np
from sympy import *
init_printing()

A = Matrix([[1, 2], [1, 100]])
B = Matrix([[3, 4], [10, 1000]])
AA = MatrixSymbol('A',2,2)
BB = MatrixSymbol('B',2,2)
mulab = lambdify([AA,BB],AA*BB)
print(mulab(A,B))
print(A*B)

дает

[7, 1010, 406, 100020]
Matrix([[23, 2004], [1003, 100004]])

Ссылкак живой версии кода

Кто-нибудь сталкивался с подобными проблемами?Известны ли обходные пути?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 декабря 2018

lambdify создает функцию, которая должна использоваться в массивах NumPy.Если вы передадите объект SymPy этой функции, результирующее поведение будет неопределенным.Если вы хотите оценить выражения SymPy для выражений SymPy, просто используйте выражение SymPy, используя subs для замены выражения.

>>> (AA*BB).subs({AA: A, BB: B}).doit()
⎡ 23    2004 ⎤
⎢            ⎥
⎣1003  100004⎦

Если у вас есть массивы NumPy, тогда вы хотите использовать lambdify:

>>> mulab(np.array([[1,2],[1,100]]), np.array([[3,4],[10,1000]]))
 [[    23   2004]
 [  1003 100004]]
...