Esta podría ser menos una pregunta de implementación y más una pregunta de "filosofía", pero ¿no debería funcionar la Norma Frobenius en Vectores? Fuente: Wolfram
Actualmente, la Norma Frobenius en numpy no acepta vectores:
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'))
Lo que resulta en:
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.
Esto parece un error en el manejo del 'fro'
kwarg:
>>> print(np.linalg.norm(b))
1.7547099704258247
Tenga en cuenta que la norma de Frobenius es la predeterminada cuando ord
kwarg es Ninguno.
xref gh-14719 y gh-14215: Pensamos en desaprobar el caso general, pero nunca seguimos adelante porque si bien no había una gran resistencia, sí la hubo. Y algunos otros paquetes lo definen así. Entonces, la cuestión es decidir dónde ir exactamente aquí ...
Como Ross me señaló, el problema / PR que vinculé están relacionados solo tangencialmente y esto es claramente un error en el manejo de "fro"
.
¡Un PR para solucionar el error en el manejo de kwarg (y las pruebas que lo acompañan) es bienvenido! Buena captura @TNonet
Dado que este es mi primer problema, ¿existen recursos para realizar las pruebas adecuadas y una solicitud de extracción?
(Además, si tuviera que clonar el repositorio numpy y ejecutar setup.py, ¿cómo me aseguraría de qué versión numpy uso cuando importo numpy?)
Yo diría que si ord es 'fro', entonces las líneas 2512-14 a continuación.
Debería cambiarse a:
if ((ord is None) or
(ord in ('f', 'fro')) or
(ord == 2 and ndim == 1)):
Suponiendo que todos estén de acuerdo en que una matriz de enésimo orden tiene una norma forzosa que, naturalmente, suma los cuadrados de cada elemento.
En realidad, el problema está un poco más abajo en el código: si sigue el rastreo del error que recibió originalmente, debería poder encontrar el bit ofensivo.
Como se mencionó en las discusiones en # 14719 y # 14215, el comportamiento para> 2 dimensiones es un tema separado - sería mejor si pudiera limitar este PR al error en el manejo de kwarg.
Re: recursos para probar / contribuir: eche un vistazo a las pautas de contribución de NumPy . También puede echar un vistazo a las pruebas de linalg en numpy/linalg/tests/test_linalg.py
para tener una idea de cómo se formulan las pruebas y dónde podrían ser apropiadas pruebas adicionales. ¡Espero que ayude!
Comentario más útil
En realidad, el problema está un poco más abajo en el código: si sigue el rastreo del error que recibió originalmente, debería poder encontrar el bit ofensivo.
Como se mencionó en las discusiones en # 14719 y # 14215, el comportamiento para> 2 dimensiones es un tema separado - sería mejor si pudiera limitar este PR al error en el manejo de kwarg.
Re: recursos para probar / contribuir: eche un vistazo a las pautas de contribución de NumPy . También puede echar un vistazo a las pruebas de linalg en
numpy/linalg/tests/test_linalg.py
para tener una idea de cómo se formulan las pruebas y dónde podrían ser apropiadas pruebas adicionales. ¡Espero que ayude!