sympy dot product приводит к списку

У меня есть две симметричные матрицы, U и B:

>> U
<< Matrix([
   [1.0,   0,   0,   0],
   [  0, 1.0,   0,   0],
   [  0,   0, 1.0,   0],
   [  0,   0,   0, 1.0]])
>> B
<< Matrix([
   [sqrt(2)/2,  0.5*sqrt(2)*I,             0,          0],
   [        0,              0, 0.5*sqrt(2)*I,  sqrt(2)/2],
   [        0,              0, 0.5*sqrt(2)*I, -sqrt(2)/2],
   [sqrt(2)/2, -0.5*sqrt(2)*I,             0,          0]])

Применение к ним скалярного произведения приводит к списку вместо матрицы 4x4:

>> U.dot(B)
<< [0.5*sqrt(2),
    0,
    0,
    0.5*sqrt(2),
    0.5*sqrt(2)*I,
    0,
    0,
    -0.5*sqrt(2)*I,
    0,
    0.5*sqrt(2)*I,
    0.5*sqrt(2)*I,
    0,
    0,
    0.5*sqrt(2),
    -0.5*sqrt(2),
    0]

Напротив, numpy выглядит правильно:

>> numpy.dot(sympy.matrix2numpy(U),sympy.matrix2numpy(B))
<< array([[0.5*sqrt(2), 0.5*sqrt(2)*I, 0, 0],
   [0, 0, 0.5*sqrt(2)*I, 0.5*sqrt(2)],
   [0, 0, 0.5*sqrt(2)*I, -0.5*sqrt(2)],
   [0.5*sqrt(2), -0.5*sqrt(2)*I, 0, 0]], dtype=object)

Что я делаю не так? Это ожидаемое поведение?


person luciano    schedule 15.12.2017    source источник


Ответы (2)


В отличие от NumPy, в SymPy dot означает скалярное произведение векторов. Он разработан таким образом, что вы можете получить скалярное произведение двух векторов строк или столбцов, не беспокоясь об использовании .T, но, возможно, здесь слишком слабая форма, так как он буквально берет скалярное произведение list(U) и list(B).

Здесь, наверное, слишком лениво. Я открыл для этого проблему SymPy. Для SymPy было бы правильнее генерировать исключение в этом случае.

Как правильно указал @Wrzlprmft, SymPy использует * для умножения матриц (или @, если вы используете Python 3.5 или выше).

person asmeurer    schedule 18.12.2017
comment
Большое спасибо за объяснение и за отправку вопроса! - person luciano; 21.12.2017

SymPy использует операцию * для умножения матриц, т. е. вы хотите использовать:

U*B

# Matrix([
# [0.5*sqrt(2),  0.5*sqrt(2)*I,             0,            0],
# [          0,              0, 0.5*sqrt(2)*I,  0.5*sqrt(2)],
# [          0,              0, 0.5*sqrt(2)*I, -0.5*sqrt(2)],
# [0.5*sqrt(2), -0.5*sqrt(2)*I,             0,            0]])

Как видите, элементы такие же, как и ваш список, но с нужной структурой.

person Wrzlprmft    schedule 15.12.2017