Numpy: Норма Фробениуса определена для векторов?

Созданный на 6 февр. 2020  ·  6Комментарии  ·  Источник: numpy/numpy

Это может быть не столько вопрос реализации, сколько вопрос «философии», но разве Норма Фробениуса не должна работать с векторами? Источник: Wolfram

В настоящее время Норма Фробениуса в numpy не принимает векторы:

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

Что приводит к:

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

Самый полезный комментарий

Проблема на самом деле находится немного дальше в коде - если вы проследите обратную связь с ошибкой, которую вы получили изначально, вы сможете найти проблемный бит.

Как упоминалось в обсуждениях в # 14719 и # 14215, поведение для> 2 измерений является отдельной проблемой - было бы лучше, если бы вы могли ограничить этот PR ошибкой в ​​обработке kwarg.

Re: ресурсы для тестирования / участия: ознакомьтесь с правилами участия NumPy . Вы также можете взглянуть на тесты linalg в numpy/linalg/tests/test_linalg.py чтобы получить представление о том, как сформулированы тесты и где могут быть уместны дополнительные тесты. Надеюсь, это поможет!

Все 6 Комментарий

Это похоже на ошибку в обработке 'fro' kwarg:

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

Обратите внимание, что норма Фробениуса используется по умолчанию, когда ord kwarg равно None.

xref gh-14719 и gh-14215: Мы думали об отказе от общего случая, но потом так и не пошли дальше, потому что, хотя большого сопротивления не было, оно было. И некоторые другие пакеты определяют это как это. Так что вопрос в том, куда именно здесь идти ...

Как сказал мне Росс, проблема / PR, с которыми я связан, связаны лишь косвенно, и это совершенно очевидно ошибка в обработке "fro" .

PR для устранения ошибки в обработке kwarg (и сопутствующих тестах) приветствуется! Хороший улов @TNonet

Поскольку это моя первая проблема, есть ли какие-либо ресурсы для проведения надлежащих тестов и запроса на перенос?

(Кроме того, если бы я должен был клонировать репозиторий numpy и запустить setup.py, как бы я мог убедиться, какую версию numpy я использую при импорте numpy?)

Я бы сказал, что если ord - это 'fro', то строки 2512-14 ниже.

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

Необходимо изменить на:

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

Предполагая, что все согласны с тем, что массив n-го порядка имеет запретную норму, которая естественным образом суммирует квадраты каждого элемента.

Проблема на самом деле находится немного дальше в коде - если вы проследите обратную связь с ошибкой, которую вы получили изначально, вы сможете найти проблемный бит.

Как упоминалось в обсуждениях в # 14719 и # 14215, поведение для> 2 измерений является отдельной проблемой - было бы лучше, если бы вы могли ограничить этот PR ошибкой в ​​обработке kwarg.

Re: ресурсы для тестирования / участия: ознакомьтесь с правилами участия NumPy . Вы также можете взглянуть на тесты linalg в numpy/linalg/tests/test_linalg.py чтобы получить представление о том, как сформулированы тесты и где могут быть уместны дополнительные тесты. Надеюсь, это поможет!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги