Numpy: Frobenius Norm für Vektoren definiert?

Erstellt am 6. Feb. 2020  ·  6Kommentare  ·  Quelle: numpy/numpy

Dies mag weniger eine Implementierungsfrage als vielmehr eine "philosophische" Frage sein, aber sollte die Frobenius-Norm nicht auf Vektoren funktionieren? Quelle: Wolfram

Derzeit akzeptiert die Frobenius-Norm in numpy keine Vektoren:

import numpy as np
a = np.random.rand(10, 1)
b = np.squeeze(a)
print(np.linalg.norm(a, 'fro'))
print(np.linalg.norm(b, 'fro'))

Was dazu führt:

1.7594677278427366
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
//anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py in norm(x, ord, axis, keepdims)
   2515             try:
-> 2516                 ord + 1
   2517             except TypeError:

TypeError: can only concatenate str (not "int") to str

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-18-2ace847024a5> in <module>
      3 b = np.squeeze(a)
      4 print(np.linalg.norm(a, 'fro'))
----> 5 print(np.linalg.norm(b, 'fro'))

<__array_function__ internals> in norm(*args, **kwargs)

//anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py in norm(x, ord, axis, keepdims)
   2516                 ord + 1
   2517             except TypeError:
-> 2518                 raise ValueError("Invalid norm order for vectors.")
   2519             absx = abs(x)
   2520             absx **= ord

ValueError: Invalid norm order for vectors.
00 - Bug numpy.linalg good first issue

Hilfreichster Kommentar

Das Problem liegt eigentlich etwas weiter unten im Code - wenn Sie dem Traceback des ursprünglich erhaltenen Fehlers folgen, sollten Sie das störende Bit finden können.

Wie in den Diskussionen in #14719 und #14215 erwähnt, ist das Verhalten für >2 Dimensionen ein separates Thema - es wäre am besten, wenn Sie diesen PR auf den Fehler im Kwarg-Handling beschränken könnten.

Betreff: Ressourcen zum Testen / Beitragen: Sehen Sie sich die Beitragsrichtlinien von NumPy an . Sie können sich auch Linal-Tests in numpy/linalg/tests/test_linalg.py ansehen, um eine Vorstellung davon zu bekommen, wie Tests formuliert sind und wo zusätzliche Tests angebracht sein könnten. Ich hoffe, das hilft!

Alle 6 Kommentare

Dies sieht nach einem Fehler in der Handhabung des 'fro' Kwargs aus:

>>> print(np.linalg.norm(b))
1.7547099704258247

Beachten Sie, dass die Frobenius-Norm die Standardeinstellung ist, wenn ord kwarg None ist.

xref gh-14719 und gh-14215: Wir dachten darüber nach, den allgemeinen Fall zu verwerfen, gingen dann aber nie weiter, da es zwar keinen großen Widerstand gab, aber einige. Und einige andere Pakete definieren es so. Die Frage ist also, wo genau man hier hingehen soll...

Wie Ross mir betonte, sind die von mir verlinkten Probleme/PR nur tangential miteinander verbunden und dies ist ganz klar ein Fehler in der Handhabung von "fro" .

Eine PR zur Behebung des Fehlers im Kwarg-Handling (und begleitenden Tests) ist willkommen! Schöner Fang @TNonet

Da dies mein erstes Problem ist, gibt es Ressourcen für die Durchführung geeigneter Tests und eine Pull-Anfrage?

(Außerdem, wenn ich das numpy-Repository klonen und setup.py ausführen würde, wie würde ich dann sicherstellen, welche numpy-Version ich beim Importieren von numpy verwende?)

Ich würde argumentieren, wenn ord 'fro' ist, dann die Zeilen 2512-14 unten.

https://github.com/numpy/numpy/blob/dae4f67c797176c66281101be8f3b4d6c424735c/numpy/linalg/linalg.py#L2510 -L2524

müsste geändert werden in:

if ((ord is None) or 
    (ord in ('f', 'fro')) or 
    (ord == 2 and ndim == 1)): 

Angenommen, alle sind sich einig, dass ein Array n-ter Ordnung eine Forbenious Norm hat, die auf natürliche Weise die Quadrate jedes Elements summiert.

Das Problem liegt eigentlich etwas weiter unten im Code - wenn Sie dem Traceback des ursprünglich erhaltenen Fehlers folgen, sollten Sie das störende Bit finden können.

Wie in den Diskussionen in #14719 und #14215 erwähnt, ist das Verhalten für >2 Dimensionen ein separates Thema - es wäre am besten, wenn Sie diesen PR auf den Fehler im Kwarg-Handling beschränken könnten.

Betreff: Ressourcen zum Testen / Beitragen: Sehen Sie sich die Beitragsrichtlinien von NumPy an . Sie können sich auch Linal-Tests in numpy/linalg/tests/test_linalg.py ansehen, um eine Vorstellung davon zu bekommen, wie Tests formuliert sind und wo zusätzliche Tests angebracht sein könnten. Ich hoffe, das hilft!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen