Isso pode ser menos uma questão de implementação e mais uma questão de "filosofia", mas a norma Frobenius não deveria funcionar em vetores? Fonte: Wolfram
Atualmente, a Norma Frobenius em numpy não aceita vetores:
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'))
O que resulta em:
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.
Isso parece um bug no manuseio do 'fro'
kwarg:
>>> print(np.linalg.norm(b))
1.7547099704258247
Observe que a norma Frobenius é o padrão quando ord
kwarg é Nenhum.
xref gh-14719 e gh-14215: Pensamos em descartar o caso geral, mas nunca avançamos porque, embora não houvesse uma grande resistência, havia alguma. E alguns outros pacotes o definem assim. Portanto, a questão é decidir para onde exatamente ir aqui ...
Como Ross apontou para mim, o problema / PR que vinculei estão apenas tangencialmente relacionados e isso é claramente um bug no manuseio de "fro"
.
Um PR para resolver o bug no tratamento do kwarg (e os testes que o acompanham) é bem-vindo! Boa captura @TNonet
Como este é meu primeiro problema, há algum recurso para fazer testes adequados e uma solicitação de pull?
(Além disso, se eu fosse clonar o numpy repo e executar setup.py, como me certificaria de qual versão numpy devo usar ao importar o numpy?)
Eu argumentaria se ord for 'fro', então as linhas 2512-14 abaixo.
Precisaria ser alterado para:
if ((ord is None) or
(ord in ('f', 'fro')) or
(ord == 2 and ndim == 1)):
Supondo que todos concordem que um array de enésima ordem tem uma Norma Forbenious que soma naturalmente os quadrados de cada elemento.
O problema está um pouco mais abaixo no código - se você seguir o rastreamento do erro que recebeu originalmente, deverá ser capaz de encontrar a parte ofensiva.
Conforme mencionado nas discussões em # 14719 e # 14215, o comportamento para> 2 dimensões é um problema separado - seria melhor se você pudesse limitar este PR ao bug no manuseio de kwarg.
Re: recursos para teste / contribuição: dê uma olhada nas diretrizes de contribuição do NumPy . Você também pode dar uma olhada nos testes linalg em numpy/linalg/tests/test_linalg.py
para ter uma ideia de como os testes são formulados e onde testes adicionais podem ser apropriados. Espero que ajude!
Comentários muito úteis
O problema está um pouco mais abaixo no código - se você seguir o rastreamento do erro que recebeu originalmente, deverá ser capaz de encontrar a parte ofensiva.
Conforme mencionado nas discussões em # 14719 e # 14215, o comportamento para> 2 dimensões é um problema separado - seria melhor se você pudesse limitar este PR ao bug no manuseio de kwarg.
Re: recursos para teste / contribuição: dê uma olhada nas diretrizes de contribuição do NumPy . Você também pode dar uma olhada nos testes linalg em
numpy/linalg/tests/test_linalg.py
para ter uma ideia de como os testes são formulados e onde testes adicionais podem ser apropriados. Espero que ajude!