numpy.dot дает неправильный ответ для больших целых чисел - PullRequest
0 голосов
/ 04 июня 2018

Я работаю над некоторыми элементами линейной алгебры и просто не могу понять, почему numpy дает следующее:

enter image description here

результат, который я получил от Mathematica, и вручную это

enter image description here

Редактировать : Если вам нужны матрицы:

test = [[19722145, -21016468, 51417377],
        [-185674670, 298847128, -428429486],
        [289326728, -516012704, 691212936]]

A = [[9, 4, 1], [2, 0, 8], [-8, 8, -8]]

Ответы [ 2 ]

0 голосов
/ 21 июля 2019

Python (или Perl, C, C ++, Java, Fortran и многие другие) часто не отображает точное ожидаемое десятичное число

https://docs.python.org/2/tutorial/floatingpoint.html

thisможет помочь

0 голосов
/ 04 июня 2018

Как отмечает @PaulPanzer, вам нужно использовать np.int64 массивы dtype.NumPy использует np.int32 для ваших входных массивов в конфигурации вашей платформы / системы 1 и не проверяет переполнение целых чисел.

Однако результат умножения матрицывключает в себя целые числа, которые слишком велики для хранения в np.int32.

Поскольку NumPy не автоматически переводит входные массивы в np.int64, вам необходимо явно указать np.int64, либо при определении массиваили с помощью апскейтинга:

import numpy as np

test = np.array([[19722145, -21016468, 51417377],
                 [-185674670, 298847128, -428429486],
                 [289326728, -516012704, 691212936]],
                dtype=np.int64)

A = np.array([[9, 4, 1],
              [2, 0, 8],
              [-8, 8, -8]],
             dtype=np.int64)

res = np.dot(test, A)

print(res)

[[ -275872647   490227596  -559748615]
 [ 2354058114 -4170134568  5632538242]
 [-3957788344  6687010400 -9368478392]]

1 Вот другой пример .Кроме того, было обсуждение проблем платформы .

...