Ordenação com NumPy
No mundo da inteligência artificial (IA), vetores, matrizes e tensores desempenham um papel crucial. Eles são o centro do armazenamento e manipulação de dados numéricos. Uma das operações essenciais que você pode realizar nesses dados é a ordenação (sorting). NumPy conta com vários métodos para realizar essas operações.
Métodos de sorting permitem reorganizar os elementos de um arranjos NumPy em ordens crescentes ou decrescentes. Neste post, abordaremos os três métodos de ordenação principais fornecidos pelo NumPy: np.sort(), np.partition() e np.argsort().
Método np.sort()
A maneira mais direta de ordenar um arranjo Numpy é usando sua função np.sort() integrada. Ela possui algoritmos de ordenação como quicksort, mergesort, heapsort e stable. O algoritmo padrão é o quicksort, mas ele pode ser alterado especificando kind=’nome do algoritmo desejado’ como um argumento do método np.sort(). O método np.sort() ordena o arranjo retornando uma cópia contendo todos os elementos originais em ordem crescente.
import numpy as np
meu_arr = np.array([2, 5, 10, 20, 3])
meu_arr_ordenado = np.sort(meu_arr) # cria um arranjo ordenado em ordem crescente
print(meu_arr_ordenado)
# resultado: [ 2 3 5 10 20]
Para ordenar um arranjo em ordem decrescente, uma forma é mostrada abaixo. Ela usa [::-1] para inverter a ordem:
import numpy as np
meu_arr = np.array([2, 5, 10, 20, 3])
meu_arr_ordenado = np.sort(meu_arr)[::-1] # cria um arranjo ordenado em ordem decrescente
print(meu_arr_ordenado)
# resultado: [20 10 5 3 2]
Outra maneira de acessar a funcionalidade np.sort() é a usando diretamente como um atributo do objeto do arranjo. Isso nos permite ordenar um arranjo sem modificar sua forma ou tamanho e também sem criar um novo arranjo. Veja um exemplo desse procedimento abaixo:
import numpy as np
meu_arr = np.array([2, 5, 10, 20, 3, 120, 50, 70])
meu_arr.sort()
print(meu_arr)
# resultado: [ 2 3 5 10 20 50 70 120]
Método np.sort() em arranjos multidimensionais em eixo especificado
Para trabalhar com arranjos multidimensionais, o método np.sort() pode ser usado para ordenação em um eixo especificado com a palavra-chave axis. Por exemplo, em uma matriz, o método np.sort(matriz, axis=0) ordena seus elementos ao longo de suas linhas. Já np.sort(matriz, axis=1) ordena os elementos de um arranjo ao longo de suas colunas. Veja abaixo:
import numpy as np
meu_arr = np.array([[1, 30, 22], [16, 24, 54], [19, 88, 72]])
meu_arr.sort(axis=0)
print(meu_arr)
# resultado:
# [[ 1 24 22]
# [16 30 54]
# [19 88 72]]
Método np.argsort()
Se você precisar de mais controle sobre o processo de ordenação ou quiser criar um esquema de ordenação personalizado, poderá usar a função np.argsort(). Esse método retorna os índices que ordenam um arranjo. A partir deles, você pode executar operações facilmente.
arr = np.array([9, 5, 1, 10, 3]) # argsort com arranjo unidimensional
print(arr.argsort())
# resultados: [2 4 1 0 3]
arr = np.array([[5, 2, 9], [1, 6, 8]]) # argsort com arranjo bidimensional
print(arr.argsort())
# resultados
# [[1 0 2]
# [0 1 2]]
A função np.argsort() é particularmente comum em processos de pré-processamento.
Método np.partition()
np.partition() é uma função bastante poderosa, especialmente quando não dispomos de muita memória para alocação. Ela retorna uma estrutura de dados particionada que contém um elemento pivô e seus elementos associados ordenados a partir dele. Ao invés de ordenar um arranjo completo, np.partition() faz uma ordenação parcial de acordo com a posição de um elemento de interesse. Isso permite uma ordenação mais eficiente em alguns cenários.
arr = np.array([3, 2, 5, 1, 4, 0, 7, 8])
arr_particionado = np.partition(arr, 2) # ordena apenas até o terceiro elemento - índice = 2
print(arr_particionado)
# resultados: [0 1 2 5 4 3 7 8]
O método np.partition() é ideal quando trabalhamos com conjuntos de dados em que os N elementos menores superiores são de interesse. Para estes casos, ele oferece uma opção mais eficiente do que o método tradicional np.sort(). Uma variante do np.partition() bastante útil em alguns cenários é o np.argpartition(). Assim como o np.argsort(), ele retorna os índices dos elementos ao invés de seus valores.
arr = np.array([3, 2, 5, 1, 4, 0, 7, 8])
arr_particionado_idxs = np.argpartition(arr, 2) # retorna apenas os índices particionados
print(arr_particionado_idxs)
# resultados: [5 3 1 2 4 0 6 7]
Conclusões
NumPy oferece vários métodos de ordenação vetorizada. Neste post, nos concentramos em alguns, mas existem outras opções para casos ainda mais avançados. A escolha do método de ordenação depende do seu caso de uso específico e dos seus requisitos de desempenho. Se você precisa ordenar um array rapidamente e não se importa em alocar memória adicional, np.sort() é uma boa escolha. No entanto, se você precisar encontrar os menores elementos em um arranjo, np.partition() pode ser mais adequado. Para fins de ordenação in-loco ou pré-processamento, np.argsort() é uma excelente opção.
Veja também:
Encontrou algum erro ou quer fazer uma sugestão? Por favor, entre em contato usando nosso formulário de contatos.