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