2017-03-20 9 views
2

Ich versuche, eine Funktion mit den Argumenten (a,tol=1e-8), die einen booleschen Wert zurückgibt, der dem Benutzer sagt, ob die Matrix symmetrisch ist oder nicht (symmetrische Matrix ist gleich seiner Transponierung). Bisher habe ich:Überprüfen, ob eine Matrix in Numpy symmetrisch ist

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 

obwohl ich eine axes isn't defined Nachricht erhalte, damit ich bin ziemlich sicher, dass überhaupt nicht funktioniert ...... die Tests Ich mag würde passieren, sind:

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) 

Jede Hilfe wird geschätzt, danke!

+0

Angenommen, Ihre Matrizen verwenden nur 2D sind, müssen Sie eine Achsen Schlüsselwort nicht brauchen. Außerdem sollten Sie eine Matrix nicht transponiert halten und dann die Transponierte der Matrix überprüfen. Im Moment prüfen Sie die Gleichheit zweier transponierter Matrizen. – Paul

+0

Die gestrige Frage zum symmetrischen Matrixtest: http://stackoverflow.com/questions/42876082/python-numpy-see-if-an-array-is-symmetric-within-a-tolerance – hpaulj

+0

oh danke für den Link ... obwohl ich anfing, es irgendwie arbeiten zu lassen, obwohl meine Tests nicht ganz richtig waren: 'def check_symmetric (a, tol = 1e-8): wenn np.transpose (a.any()) == np.array (a.any()): return true def sqr (e): rows = len (s) für Zeile in sq: wenn len (Zeile) = Zeilen: return false return true wenn ein ! = sqr (s): raise ValueError' – plshalp

Antwort

9

Sie können einfach allclose

def check_symmetric(a, tol=1e-8): 
    return numpy.allclose(a, a.T, atol=tol) 
+0

omg das ist so schön ahhaha, danke einen Haufen, ich weiß es zu schätzen – plshalp

+0

alternativ, überprüfen Sie a-a.T <(tol * a.shape ** 2) –

Verwandte Themen