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.
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.
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!
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!