Numpy: Norme Frobenius définie pour les vecteurs ?

Créé le 6 févr. 2020  ·  6Commentaires  ·  Source: numpy/numpy

Il s'agit peut-être moins d'une question de mise en œuvre que d'une question de "philosophie", mais la norme Frobenius ne devrait-elle pas fonctionner sur les vecteurs ? Source : Wolfram

Actuellement, la norme Frobenius dans numpy n'accepte pas les vecteurs :

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'))

Ce qui se traduit par :

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

Commentaire le plus utile

Le problème est en fait un peu plus bas dans le code - si vous suivez le retraçage de l'erreur que vous avez reçue à l'origine, vous devriez pouvoir trouver le bit incriminé.

Comme mentionné dans les discussions dans # 14719 et # 14215, le comportement pour> 2 dimensions est un problème distinct - il serait préférable que vous puissiez limiter ce PR au bogue dans la gestion de kwarg.

Re : ressources pour tester/contribuer : jetez un œil aux directives de contribution de NumPy . Vous pouvez également jeter un œil aux tests de linalg dans numpy/linalg/tests/test_linalg.py pour avoir une idée de la façon dont les tests sont formulés et où des tests supplémentaires pourraient être appropriés. J'espère que cela pourra aider!

Tous les 6 commentaires

Cela ressemble à un bug dans la gestion du 'fro' kwarg :

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

Notez que la norme Frobenius est la valeur par défaut lorsque le ord kwarg est Aucun.

xref gh-14719 et gh-14215 : Nous avons pensé à déprécier le cas général, mais nous n'avons jamais continué car même s'il n'y avait pas une énorme résistance, il y en avait. Et certains autres packages le définissent comme cela. Le problème est donc de décider où aller exactement ici ...

Comme Ross me l'a fait remarquer, le problème/les relations publiques que j'ai liés ne sont que tangentiellement liés et il s'agit clairement d'un bogue dans la gestion des "fro" .

Un PR pour corriger le bug dans la gestion de kwarg (et les tests qui l'accompagnent) est le bienvenu ! Belle prise @TNonet

Puisqu'il s'agit de mon premier problème, existe-t-il des ressources pour effectuer des tests appropriés et une demande d'extraction ?

(De plus, si je devais cloner le référentiel numpy et exécuter setup.py, comment m'assurer de la version numpy que j'utilise lorsque j'importe numpy ?)

Je dirais que si ord est 'fro', alors les lignes 2512-14 ci-dessous.

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

Devrait être changé en :

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

En supposant que tout le monde soit d'accord pour dire qu'un tableau d'ordre n a une norme Forbenious qui résume naturellement les carrés de chaque élément.

Le problème est en fait un peu plus bas dans le code - si vous suivez le retraçage de l'erreur que vous avez reçue à l'origine, vous devriez pouvoir trouver le bit incriminé.

Comme mentionné dans les discussions dans # 14719 et # 14215, le comportement pour> 2 dimensions est un problème distinct - il serait préférable que vous puissiez limiter ce PR au bogue dans la gestion de kwarg.

Re : ressources pour tester/contribuer : jetez un œil aux directives de contribution de NumPy . Vous pouvez également jeter un œil aux tests de linalg dans numpy/linalg/tests/test_linalg.py pour avoir une idée de la façon dont les tests sont formulés et où des tests supplémentaires pourraient être appropriés. J'espère que cela pourra aider!

Cette page vous a été utile?
0 / 5 - 0 notes