2012-02-06 10 views
13

In NumPy, sto cercando di usare linalg per calcolare gli inversi di matrice in ogni fase di uno schema di Newton-Raphson (la dimensione del problema è piccola intenzionalmente in modo da può invertire matrici hessiane calcolate analiticamente). Tuttavia, dopo essere andato molto avanti verso la convergenza, l'Iuta si avvicina al singolare.Come provare - tranne una operazione di matrice illegale a causa della singolarità in NumPy

C'è qualche metodo in NumPy che mi consente di verificare se una matrice è considerata singolare (il determinante del calcolo non è abbastanza robusto)? Idealmente, sarebbe bello se ci fosse un modo per usare un blocco tryexcept per catturare l'errore di un singolo array di NumPy.

Come faccio? L'errore NumPy data al terminale è:

raise LinAlgError, 'Singular matrix' 
numpy.linalg.linalg.LinAlgError: Singular matrix 

risposta

24

La sintassi sarebbe come questo:

import numpy 

try: 
    # your code that will (maybe) throw 
except numpy.linalg.linalg.LinAlgError as err: 
    if 'Singular matrix' in err.message: 
     # your error handling block 
    else: 
     raise 
+0

Grazie. È uno di quei momenti "d'oh" che schiaffeggiano la testa; Non mi ero reso conto che avremmo potuto usare direttamente gli errori NumPy in un'istruzione 'except'. – ely

+0

Inoltre, c'è un modo per renderlo specifico per "Singular matrix" e non solo per qualsiasi istanza di LinAlgError? – ely

+1

Bene, puoi controrilanciare l'eccezione rilevata se non è quel messaggio .. guarda l'ultima modifica alla mia risposta. Questo è un modo per farlo, non sono sicuro se c'è forse un modo migliore. – wim

3

wim 's risposta non lavora più per le versioni attuali di NumPy (sto usando 1.13 presso il tempo di scrittura). Invece:

import numpy as np 

try: 
    # your code that will (maybe) throw 
except np.linalg.LinAlgError as e: 
    if 'Singular matrix' in str(e): 
     # your error handling block 
    else: 
     raise 
Problemi correlati