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