Это может быть не столько вопрос реализации, сколько вопрос «философии», но разве Норма Фробениуса не должна работать с векторами? Источник: 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.
Это похоже на ошибку в обработке '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 ниже.
Необходимо изменить на:
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
чтобы получить представление о том, как сформулированы тесты и где могут быть уместны дополнительные тесты. Надеюсь, это поможет!
Самый полезный комментарий
Проблема на самом деле находится немного дальше в коде - если вы проследите обратную связь с ошибкой, которую вы получили изначально, вы сможете найти проблемный бит.
Как упоминалось в обсуждениях в # 14719 и # 14215, поведение для> 2 измерений является отдельной проблемой - было бы лучше, если бы вы могли ограничить этот PR ошибкой в обработке kwarg.
Re: ресурсы для тестирования / участия: ознакомьтесь с правилами участия NumPy . Вы также можете взглянуть на тесты linalg в
numpy/linalg/tests/test_linalg.py
чтобы получить представление о том, как сформулированы тесты и где могут быть уместны дополнительные тесты. Надеюсь, это поможет!