Заметил странную особенность numpy - разный результат на одних и тех же данных.
import numpy as np
A = np.random.normal(size=(100, 10000))
B = np.random.normal(size=(10000, 100))
Z1 = np.dot(A, B)
Z2 = np.dot(A, B)
print("A.dtype: %s\nB.dtype: %s" % (A.dtype, B.dtype))
np.testing.assert_almost_equal(Z1, Z2, 13)
output:
A.dtype: float64
B.dtype: float64
..................
AssertionError:
Arrays are not almost equal to 13 decimals
(mismatch 0.02%)
x: array([[ 57.7906116662244, -23.0575175462736, -199.5869048134938, ...,
-60.9155744929318, 81.7378975172054, -29.3638802800916],
[ 90.6673561120846, 75.8409703042503, 81.313634897308 , ...,...
y: array([[ 57.7906116662244, -23.0575175462736, -199.5869048134938, ...,
-60.9155744929318, 81.7378975172054, -29.3638802800916],
[ 90.6673561120846, 75.8409703042503, 81.313634897308 , ...,...
Почему так? Может дело в особенностях параллельного BLAS или Lapack? Неопределенная последовательность суммирования элементов при вычислении матричного произведения?
Такой вариант дает еще больше отличий
Z2 = np.dot(B.T, A.T).T