HOWTO · NumPy

Vetor de unidade NumPy

Existem dois métodos principais que podem ser usados para normalizar um array NumPy para um vetor de unidade em Python, a função numpy.linalg.norm() e a abordagem autodefinida.

Nesta página

Normalize um vetor NumPy não nulo dividindo-o por sua norma euclidiana: unit_vector = vector / np.linalg.norm(vector). Para [3.0, 4.0], o resultado é [0.6, 0.8].

Definição de vetor unitário

Para transformar um array NumPy unidimensional em um vetor unitário, divida cada componente pela norma euclidiana do vetor:

u = v / ||v||

Um vetor unitário tem módulo igual a um. Dividir pela norma altera o comprimento do vetor, mas preserva sua direção. Múltiplos escalares positivos de um vetor produzem a mesma direção normalizada; multiplicá-lo por um escalar negativo inverte a direção. Isso é útil quando o cálculo deve depender da direção, e não do módulo original.

Normalize com numpy.linalg.norm()

Por padrão, numpy.linalg.norm() de NumPy calcula a norma euclidiana de um array unidimensional. Execute este exemplo para criar um array, dividi-lo pela própria norma e imprimir os componentes normalizados.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

import numpy as np

vector = np.array([3.0, 4.0])
unit_vector = vector / np.linalg.norm(vector)
print(unit_vector)
[0.6 0.8]

Para esta entrada, a norma é 5, então cada componente é dividido por 5. Use uma entrada de ponto flutuante quando quiser obter componentes fracionários no resultado. O resultado mantém a mesma forma unidimensional da entrada.

Calcule a norma manualmente

Para um vetor v com componentes v[i], a norma euclidiana é a raiz quadrada da soma dos quadrados dos componentes. Em NumPy, esse cálculo é sqrt(sum(v ** 2)); dividir o vetor por esse valor produz a mesma fórmula de normalização. Essa versão deixa cada etapa matemática explícita e pode ser útil para aprender ou adaptar o cálculo.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

import numpy as np

vector = np.array([3.0, 4.0])
norm = np.sqrt(np.sum(vector ** 2))
unit_vector = vector / norm
print(unit_vector)

A fórmula manual apresentada aqui se aplica a um vetor real comum e unidimensional. Para arrays com valores complexos ou outras definições de norma, use a operação apropriada de NumPy, em vez de presumir que elevar os componentes ao quadrado produz o módulo desejado.

Trate vetores zero e o formato da entrada

Um vetor cujos componentes são todos zero tem norma zero. Dividir por essa norma é indefinido, e não é possível normalizar o vetor zero para transformá-lo em um vetor unitário, pois ele não tem direção. Defina uma política explícita para essa entrada, como lançar um ValueError em uma função reutilizável ou tratá-la antes da normalização no código que chama a função. Retornar o próprio vetor zero evita a divisão, mas não o transforma em um vetor unitário.

Os exemplos anteriores usam um único vetor de formato (n,). Se um array armazenar vários vetores, seu formato e o eixo passado ao cálculo da norma determinam o que será normalizado. Por exemplo, um array bidimensional pode armazenar vetores em linhas ou colunas; selecione o eixo que representa cada vetor e, em seguida, divida cada linha ou coluna pela norma correspondente usando broadcasting. Não normalize uma matriz inteira como se fosse um único vetor, a menos que essa seja a operação matemática desejada.

Verifique o resultado e escolha um método

Para uma entrada não nula, confira se a norma do vetor normalizado é aproximadamente um, considerando os arredondamentos de ponto flutuante. Para o caso unidimensional, use np.isclose(np.linalg.norm(unit_vector), 1.0). Em geral, a igualdade exata não é adequada para cálculos de ponto flutuante, pois os componentes arredondados podem produzir uma norma muito próxima de um, mas não exatamente igual a esse valor.

Use numpy.linalg.norm() no fluxo habitual de trabalho com NumPy: ela expressa claramente a intenção e permite selecionar o comportamento da norma para outras tarefas. Use a fórmula manual da soma dos quadrados para explicar o cálculo euclidiano ou quando for necessário mostrar suas etapas. Ambos os métodos exigem uma norma diferente de zero, e nenhum deles transforma o vetor zero em um vetor unitário. Ao trabalhar com mais de um vetor, deixe explícitos o formato da entrada e o eixo de normalização.