If you do science with Python, you always end up with using numpy, a wonderful extension to work with arrays and matrices efficiently. But... there is a but... it is not statically typed and can create some funny results, like when you multiply a matrix by a vector with a dot product.
>>> import numpy as np >>> A = np.asarray([[1.0, 2.0], [3.0, 4.0]]) >>> B = np.asarray([5.0, 6.0]) >>> np.dot(A, B) array([ 17., 39.]) >>> np.dot(B, A) array([ 23., 34.])
What is happening here is that when you run
np.dot(A, B), as
a simple array, it is replicated two times to match the size of
so you effectively run:
5x1 + 6x2 and again
5x3 + 6x4.
When you run
np.dot(B, A), you run in columns:
5x1 + 6x3 and
5x2 + 6x4.
Numpy is smart, but deep into your computational code, an order swap or an error in dimensions can result in really hard to track errors. Fortran will simply send you back to the drawing board telling you that the dimensions do not match and that you should work a bit more.