2012-02-06 10 views
13

W NumPy, próbuję użyć linalg do obliczenia odwrotności macierzy na każdym kroku schematu Newtona-Raphsona (rozmiar problemu jest celowo mały, abyśmy może odwrócić analitycznie obliczone macierze Hesjan). Jednakże, gdy jestem już daleko w kierunku zbieżności, Hesjan zbliża się do pojedynczej.Jak wypróbować - z wyjątkiem nielegalnej operacji macierzy ze względu na osobliwość w NumPy

Czy istnieje jakakolwiek metoda w NumPy, która pozwala mi sprawdzić, czy macierz jest uważana za pojedynczą (wyznacznik obliczeniowy nie jest wystarczająco solidny)? Najlepiej byłoby, gdyby był sposób użycia bloku tryexcept do przechwycenia błędu liczby pojedynczej tablicy NumPy.

Jak to zrobić? Błąd NumPy podane w terminalu to:

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

Odpowiedz

24

Składnia byłoby tak:

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

Dzięki. To jeden z tych momentów "d'oh"; Nie zdawałem sobie sprawy, że możemy bezpośrednio użyć błędów NumPy w instrukcji 'except'. – ely

+0

Czy istnieje również sposób na uczynienie tego specyficznego dla "macierzy osobliwej", a nie tylko na dowolnym wystąpieniu LinAlgError? – ely

+1

Cóż, możesz ponownie wznieść wychwycony wyjątek, jeśli to nie jest ta wiadomość. Zobacz ostatnią zmianę w mojej odpowiedzi. Jest to jeden sposób, aby to zrobić, nie jestem pewien, czy istnieje lepszy sposób. – wim

3

wim „s odpowiedź nie pracuje już dla aktualnej wersji NumPy (używam 1.13 u czas pisania). Zamiast tego:

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 
Powiązane problemy