Numpy: ¿Norma Frobenius definida para vectores?

Creado en 6 feb. 2020  ·  6Comentarios  ·  Fuente: numpy/numpy

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.
00 - Bug numpy.linalg good first issue

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!

Todos 6 comentarios

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.

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

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!

¿Fue útil esta página
0 / 5 - 0 calificaciones