Estoy tratando de hacer una función con los argumentos (a,tol=1e-8) que devuelve un valor booleano que le dice al usuario si la matriz es simétrica o no (la matriz simétrica es igual a su transposición). Hasta ahora tengo:
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 aunque sigo recibiendo un mensaje de que los axes isn't defined , así que estoy bastante seguro de que no funciona en absoluto ... las pruebas que me gustaría pasar son:
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)Cualquier ayuda es apreciada, gracias!
Simplemente puede compararlo con su transposición usando allclose
def check_symmetric(a, rtol=1e-05, atol=1e-08): return numpy.allclose(a, aT, rtol=rtol, atol=atol)La siguiente función también resuelve el problema:
def check_symmetric(a, tol=1e-8): return np.all(np.abs(aa.T) < tol)Si no te preocupa el umbral tot
(a==aT).all()es la solución más sencilla. Esto también funciona para arreglos N-dimensionales (N>2).