Опасность смешивания матрицы и массива numpy

Научно-техническое приложение, над которым я работаю, имеет множество умножений матриц линейной алгебры, поэтому я использую матрицы Numpy. Однако в Python есть много функций, которые взаимозаменяемо принимают типы матрицы или массива. Красиво, нет? Ну не совсем. Позвольте мне продемонстрировать проблему на примере:

from scipy.linalg import expm
from numpy import matrix

# Setup input variable as matrix
A = matrix([[ 0, -1.0,  0,  0],
            [ 0,  0,  0,  1.0],
            [ 0,  0,  0,  0],
            [ 0,  0,  1.0,  0]])

# Do some computation with that input
B = expm(A)

b1 = B[0:2, 2:4]
b2 = B[2:4, 2:4].T

# Compute and Print the desired output
print "The innocent but wrong answer:"
print b2 * b1

print "The answer I should get:"
print matrix(b2) * matrix(b1)

При запуске вы получаете:

The innocent but wrong answer:
[[-0.16666667 -0.5       ]
 [ 0.          1.        ]]
The answer I should get, since I expected everything to still be matrices:
[[ 0.33333333  0.5       ]
 [ 0.5         1.        ]]

Любые советы или рекомендации о том, как избежать такого рода путаницы? Это действительно грязно - продолжать оборачивать переменные в вызовы матрицы (), чтобы убедиться, что они все еще являются матрицами. Кажется, что в этом отношении нет стандарта, и поэтому это может привести к ошибкам, которые трудно обнаружить.

12
задан Hamid 19 August 2012 в 07:00
поделиться