web-dev-qa-db-fra.com

Vérifier si une matrice est symétrique dans Numpy

J'essaie de créer une fonction avec les arguments (a,tol=1e-8) qui renvoie une valeur booléenne indiquant à l'utilisateur si la matrice est symétrique ou non (la matrice symétrique est égale à sa transposition). Jusqu'ici j'ai:

def check_symmetric(a, tol=1e-8):
if np.transpose(a, axes=axes) == np.transpose(a, axes=axes):
    return True
def sqr(s):
    rows = len(s)
    for row in sq:
        if len(row) != rows:
            return False
    return True
if a != sqr(s):
    raise ValueError

bien que je continue à recevoir un message axes isn't defined, je suis donc presque sûr que cela ne fonctionne pas du tout ...... les tests que j'aimerais passer sont les suivants:

e = np.eye(4)
f = np.diag([1], k=3)
g = e[1:, :]

print(check_symmetric(e))
print(not check_symmetric(e + f))
print(check_symmetric(e + f * 1e-9))
print(not check_symmetric(e + f * 1e-9, 1e-10))
try:
    check_symmetric(g)
    print(False)
except ValueError:
    print(True)

Toute aide est la bienvenue, merci!

11
plshalp

Vous pouvez simplement utiliser allclose

def check_symmetric(a, tol=1e-8):
    return numpy.allclose(a, a.T, atol=tol)
29
Nils Werner

La fonction suivante résout également le problème:

def check_symmetric(a, tol=1e-8):
    return not False in (np.abs(a-a.T) < tol)
0