Я хотел бы иметь норму одного массива NumPy. Более конкретно, я ищу эквивалентную версию этой функции
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
Есть ли что-то подобное в skearn
или numpy
?
Эта функция работает в ситуации, когда v
есть вектор 0.
raise
исключением!x/np.linalg.norm(x)
это не намного медленнее (около 15-20%), чемx/np.sqrt((x**2).sum())
в numpy 1.15.1 на процессоре.Ответы:
Если вы используете scikit-learn, вы можете использовать
sklearn.preprocessing.normalize
:источник
normalize
требуется 2D-вход. Вы можете передатьaxis=
аргумент, чтобы указать, хотите ли вы применить нормализацию к строкам или столбцам входного массива.np.linalg.norm(x)
по умолчанию вычисляется норма 'l2'. Если вы хотите, чтобы сумма вашего вектора была 1, вы должны использоватьnp.linalg.norm(x, ord=1)
ndarray
для работы сnormalize()
функцией. В противном случае это может бытьlist
.Я согласился бы, что было бы хорошо, если бы такая функция была частью включенных батарей. Но это не так, насколько я знаю. Вот версия для произвольных осей, дающая оптимальную производительность.
источник
Вы можете указать ord для получения нормы L1. Чтобы избежать деления на ноль, я использую eps, но, возможно, это не очень хорошо.
источник
[inf, 1, 2]
урожайность[nan, 0, 0]
, но не должно ли это быть[1, 0, 0]
?Это может также работать для вас
но терпит неудачу, когда
v
имеет длину 0.источник
Если у вас есть многомерные данные и вы хотите, чтобы каждая ось была нормализована до максимума или суммы:
Использует функцию numpys от пика до пика .
источник
В
unit_vector()
популярном модуле преобразований Кристофа Гольке также есть функция нормализации векторов :источник
Вы упомянули Sci-Kit Learn, поэтому я хочу поделиться другим решением.
научный комплект учить
MinMaxScaler
В Sci-Kit Learn есть API,
MinMaxScaler
который может настраивать диапазон значений, как вам нравится.Это также касается вопросов NaN для нас.
Пример кода
Код прост, просто введите
Ссылкаисточник
Без
sklearn
использования и простоnumpy
. Просто определите функцию:Предполагая, что строки являются переменными, а столбцы - samples (
axis= 1
):вывод:
источник
Если вы хотите нормализовать n векторов пространственных объектов, хранящихся в трехмерном тензоре, вы также можете использовать PyTorch:
источник
Если вы работаете с трехмерными векторами, вы можете сделать это кратко, используя toolbelt vg . Это легкий слой поверх numpy и он поддерживает отдельные значения и сложенные векторы.
Я создал библиотеку при моем последнем запуске, где она была мотивирована такими способами: простыми идеями, которые слишком многословны в NumPy.
источник
Если вам не нужна предельная точность, ваша функция может быть уменьшена до:
источник
Если вы работаете с многомерным массивом, возможно быстрое решение.
Скажем, у нас есть двумерный массив, который мы хотим нормализовать по последней оси, в то время как некоторые строки имеют нулевую норму.
источник