Проблема здесь не столько в numpy, сколько в вашем понимании вовлеченной линейной алгебры. Вопрос, который вы задаете, можно перефразировать так:
A @ x = x
A @ x = I @ x
(A - I) @ x = 0
Это конкретная c формулировка общей задачи собственный вектор с оговоркой, что собственное значение равно 1.
Numpy решает эту проблему с помощью функции np.linalg.eig
:
w, v = np.linalg.eig(A)
Вам нужно проверить, равно ли какое-либо из значений 1 (их может быть больше одного):
mask = np.isclose(w, 1)
if mask.any():
for vec in v[:, mask].T:
print(vec)
else:
print('Nope!')
Элементы v
являются единичными векторами. Имейте в виду, что любое скалярное кратное такого вектора также является решением.
Для проблем с необратимыми матрицами вы можете вместо этого использовать scipy.linalg.svd
:
v, w, _ = svd(A)
Дальнейшая процедура будет такой же.