Обратная матрица с использованием numpy
Я хотел бы использовать numpy для вычисления обратного. Но я получаю сообщение об ошибке:
'numpy.ndarry' object has no attribute I
Чтобы вычислить обратную матрицу в numpy, скажем, матрицу M, она должна быть простой:
print M.I
Здесь код:
x = numpy.empty((3,3), dtype=int)
for comb in combinations_with_replacement(range(10), 9):
x.flat[:] = comb
print x.I
Я предполагаю, что эта ошибка возникает из-за того, что x теперь плоский, поэтому команда "I
" несовместима. Есть ли для этого работа?
Моя цель - распечатать ИНВЕРСУЮ МАТРИЦУ любой возможной комбинации числовых матриц.
Ответы
Ответ 1
Атрибут I
существует только для объектов matrix
, а не ndarray
s. Вы можете использовать numpy.linalg.inv
для инвертирования массивов:
inverse = numpy.linalg.inv(x)
Обратите внимание, что способ генерации матриц, не все из них будут обратимы. Вам нужно будет либо изменить способ генерации матриц, либо пропустить те, которые не являются обратимыми.
try:
inverse = numpy.linalg.inv(x)
except numpy.linalg.LinAlgError:
# Not invertible. Skip this one.
pass
else:
# continue with what you were doing
Кроме того, если вы хотите пройти через все матрицы 3x3 с элементами, созданными из [0, 10), вы хотите следующее:
for comb in itertools.product(range(10), repeat=9):
а не combinations_with_replacement
, или вы пропустите такие матрицы, как
numpy.array([[0, 1, 0],
[0, 0, 0],
[0, 0, 0]])
Ответ 2
Еще один способ сделать это - использовать класс numpy matrix
(а не numpy array) и атрибут I
Например:
>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5, 1.5],
[ 2. , -1. ]])
Ответ 3
Обратная матрица с использованием python и numpy:
>>> import numpy as np
>>> b = np.array([[2,3],[4,5]])
>>> np.linalg.inv(b)
array([[-2.5, 1.5],
[ 2. , -1. ]])
Не все матрицы могут быть инвертированы. Например, единичные матрицы не являются обратимыми:
>>> import numpy as np
>>> b = np.array([[2,3],[4,6]])
>>> np.linalg.inv(b)
LinAlgError: Singular matrix
Решение сингулярной матричной задачи:
попробуй поймать исключение Singular Matrix и продолжай, пока не найдешь преобразование, которое соответствует твоим предыдущим критериям И также обратимо.
Интуиция о том, почему матричное обращение не всегда может быть сделано; как в единичных матрицах:
Представьте себе старый потолочный кинопроектор, который пропускает яркий свет через пленку на белую стену. Пиксели в фильме проецируются на пиксели на стене.
Если я остановлю проекцию фильма на одном кадре, вы увидите пиксели пленки на стене, и я попрошу вас восстановить фильм на основе того, что вы видите. Это легко, вы говорите, просто возьмите обратную матрицу, которая выполнила проекцию. Обратная матрица - это обращение проекции.
Теперь представьте, что проектор поврежден, и я поставил перед пленкой искаженный объектив. Теперь несколько пикселей проецируются на одно и то же место на стене. Я снова попросил вас "отменить эту операцию с обратной матрицей". Вы говорите: "Я не могу, потому что вы уничтожили информацию с помощью искажения линзы, я не могу вернуться туда, где мы были, потому что матрица либо единственная, либо вырожденная".
Матрица, которая может использоваться для преобразования некоторых данных в другие данные, является обратимой, только если процесс может быть полностью изменен без потери информации. Если ваша матрица не может быть инвертирована, возможно, вы определяете свою проекцию, используя методику "угадай и проверь", а не процесс, который гарантирует преобразование без искажений.
Если вы используете эвристику или что-то меньшее, чем совершенная математическая точность, то вам придется определить другой процесс для управления и карантина искажений, чтобы возобновить программирование с помощью броуновского движения.
Источник:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv
Ответ 4
Как насчет inv?
например.: my_inverse_array = inv (my_array)
Ответ 5
Инверсия х может быть просто рассчитана как,
1/х