У меня есть матрица с некоторыми строками и столбцами, равными нулю, поэтому она не обратима.
Мне нужно получить инверсию ненулевой подматрицы, чтобы инверсия имела ту же структуру, что и исходнаяmatrix.
Ожидаемое поведение будет примерно таким:
>>>test
array([[1, 0, 0, 2],
[0, 0, 0, 0],
[0, 0, 0, 0],
[3, 0, 0, 4]])
>>>get_nonzero(test)
array([[1, 2],
[3, 4]])
>>>np.linalg.inv(nonzero)
array([[-2. , 1. ],
[ 1.5, -0.5]])
>>>restore_shape(inv_matrix)
array([[-2. , 0. , 0. , 1. ],
[ 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ],
[ 1.5, 0. , 0. , -0.5]])
Возможно, уместно, чтобы я изначально получал матрицу test
, обнуляя строки и столбцы некоторой исходной матрицы со всеми элементами, отличными от нуляс логическим индексированием вроде:
>>>bool_index
array([False, True, True, False])
>>>original[bool_index, :] = 0
>>>original[:, bool_index] = 0
>>>original
array([[1, 0, 0, 2],
[0, 0, 0, 0],
[0, 0, 0, 0],
[3, 0, 0, 4]])
Я добился получения ненулевой подматрицы из исходной матрицы, сначала преобразовав ее в pandas DataFrame
и индексировав с помощью логических массивов с .loc
, например:
>>>pd.DataFrame(original).loc[~bool_index, ~bool_index].values
array([[1, 2],
[3, 4]])
Однако я не уверен, как мне эффективно восстановить инвертированный массив в исходную форму.