Numpy возвращается .00 ... 002 - PullRequest
       14

Numpy возвращается .00 ... 002

0 голосов
/ 14 сентября 2018

Извините, если это сообщение дублируется, я не могу найти ответ ... У меня есть следующий код:

import numpy as np

V = np.array([[6, 10, 0],
              [2, 5, 0],
              [0, 0, 0]])

subarr = np.array([[arr[0][0], arr[0][1]], [arr[1][0], arr[1][1]]])
det = np.linalg.det(subarr)
cross = np.cross(arr[0], arr[1])

print(f"Det: {det}")
print(f"Cross: {cross}")

Я ожидаю, что det вернет 10,0, а cross вернет в этом случае [0, 0, 10], причем последнее число будет равно det. По какой-то причине Python возвращает

Det: 10.000000000000002
Cross: [ 0  0 10]

Может кто-нибудь объяснить, почему?

1 Ответ

0 голосов
/ 14 сентября 2018

То, что вы видите, это неточности с плавающей запятой.

И в случае, если вам интересно, как вы попадаете с плавающей запятой, находя определитель матрицы, составленной из целых чисел (где обычный метод вычисления просто 6*5 - 2*10 = 10), np.linalg.det использует LU-разложение , чтобы найти определитель.Это не очень эффективно для матриц 2x2, но гораздо эффективнее, когда у вас большие матрицы.

Для ваших 2x2 вы получите:

scipy.linalg.lu(A, 1)
Out: 
(array([[  1.        ,  0.        ],
        [  0.33333333,  1.        ]]), 
 array([[  6.        ,  10.        ],
        [  0.        ,   1.66666667]]))

Определитель - это просто произведениедиагонали от этого, который заканчивает тем, что был 6. * 1.66666667, который разрешается к 10.00000002 из-за ошибок с плавающей запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...