Научно-техническое приложение, над которым я работаю, имеет множество умножений матриц линейной алгебры, поэтому я использую матрицы 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. ]]
Любые советы или рекомендации о том, как избежать такого рода путаницы? Это действительно грязно - продолжать оборачивать переменные в вызовы матрицы (), чтобы убедиться, что они все еще являются матрицами. Кажется, что в этом отношении нет стандарта, и поэтому это может привести к ошибкам, которые трудно обнаружить.