Numpy: Norma Frobenius definida para vetores?

Criado em 6 fev. 2020  ·  6Comentários  ·  Fonte: numpy/numpy

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

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!

Todos 6 comentários

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.

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

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!

Esta página foi útil?
0 / 5 - 0 avaliações