HOWTO · NumPy

NumPy Shuffle Duas Matrizes

Existem três métodos principais que podem ser usados para embaralhar dois arrays correspondentes em Python, a função sklearn.utils.shuffle(), a função numpy.random.shuffle() e a função numpy.random.permutation().

Nesta página

Embaralhar dois arrays relacionados significa alterar a ordem das linhas em ambos ao mesmo tempo. Se a linha i de um array descreve a linha i de outro — por exemplo, uma linha de atributos e seu rótulo — os dois arrays precisam usar a mesma permutação. Embaralhá-los de forma independente rompe essa relação. Os exemplos a seguir usam um array de atributos com duas colunas e um array de rótulos; os valores correspondentes em cada linha deixam o alinhamento visível.

Embaralhe dois arrays mantendo alinhadas as linhas correspondentes

Aplique a mesma ordem de linhas aos dois arrays. A primeira dimensão precisa ter o mesmo comprimento em cada entrada. Em arrays com várias colunas, a ordem compartilhada seleciona linhas inteiras, mantendo juntos os valores de cada linha.

Execute este exemplo com uma ordem fixa para facilitar a conferência da linha de atributos e do rótulo correspondentes:

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

import numpy as np

features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.array([2, 0, 1])

print(features[order])
print(labels[order])
[[ 30 300]
 [ 10 100]
 [ 20 200]]
[3 1 2]

A ordem fixa serve apenas para ilustrar. Quando quiser uma disposição aleatória, use uma ordem gerada por um dos métodos de embaralhamento abaixo.

Use sklearn.utils.shuffle()

sklearn.utils.shuffle() aceita vários arrays e aplica a todos uma única ordenação consistente, retornando os arrays embaralhados para você atribuí-los. Com o scikit-learn instalado, importe primeiro a função com from sklearn.utils import shuffle e depois chame features_shuffled, labels_shuffled = shuffle(features, labels). Passe todas as entradas relacionadas na mesma chamada para manter juntas as linhas correspondentes. Essa opção é conveniente quando o scikit-learn já faz parte do projeto. A ordem aleatória pode variar entre chamadas, e a função retorna resultados para atribuição, sem reorganizar os arrays de origem no próprio lugar.

A importação e a chamada exigem o scikit-learn, que não está disponível em todos os ambientes Python. Se o pacote estiver instalado, execute a importação antes da chamada e atribua os dois arrays retornados. Essa chamada específica da dependência aparece apenas como sintaxe, não como exemplo executado; as seções com NumPy abaixo apresentam alternativas executáveis sem o scikit-learn.

Use uma permutação compartilhada com NumPy

numpy.random.permutation(features.shape[0]) cria uma sequência embaralhada de índices de linhas. Armazene-a em order e selecione features[order] e labels[order]. A indexação avançada do NumPy produz resultados indexados e mantém os arrays de origem disponíveis na ordem original. Guarde order para reutilizar exatamente essa disposição, aplicá-la a outros arrays ou salvá-la junto aos dados para uma etapa posterior. Gerar e guardar a ordem dos índices também evita depender de uma interface específica de estado aleatório.

Aqui, uma única ordem gerada indexa os dois arrays. A ordem das linhas impressas varia, mas os pares de atributos e rótulos permanecem juntos:

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

import numpy as np

features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.random.permutation(features.shape[0])

features_shuffled = features[order]
labels_shuffled = labels[order]
print(features_shuffled)
print(labels_shuffled)

Embaralhe um array de índices compartilhado com NumPy

numpy.random.shuffle() altera a sequência recebida no próprio lugar. Crie um array de índices com order = np.arange(features.shape[0]), embaralhe-o com np.random.shuffle(order) e selecione os dois arrays de origem com features[order] e labels[order]. Assim, os dados de origem permanecem intactos e a ordem das linhas fica explícita. O método também funciona com arrays adicionais: indexe cada array alinhado usando os mesmos índices embaralhados. Apenas order é alterado no próprio lugar; os resultados indexados são arrays separados. Guarde uma cópia de order se outro código puder modificá-lo e você precisar preservar essa disposição.

Este exemplo altera somente order; os dois arrays de origem são indexados pela mesma sequência embaralhada:

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

import numpy as np

features = np.array([[10, 100], [20, 200], [30, 300]])
labels = np.array([1, 2, 3])
order = np.arange(features.shape[0])
np.random.shuffle(order)

features_shuffled = features[order]
labels_shuffled = labels[order]
print(features_shuffled)
print(labels_shuffled)

Confira as formas, a mutação e a reprodutibilidade

Os arrays precisam ter a primeira dimensão compatível: seus comprimentos ao longo do eixo 0 devem ser iguais, embora as demais dimensões possam ser diferentes. Por exemplo, uma matriz de linhas de atributos pode ser associada a um array de rótulos unidimensional. Confira os tamanhos da dimensão inicial antes de aplicar uma ordem de índices, para que cada índice seja válido em todos os arrays.

Os três métodos diferem no que modificam. sklearn.utils.shuffle() retorna arrays embaralhados para atribuição. numpy.random.permutation() retorna uma nova ordem de índices; usá-la para indexar arrays gera resultados reordenados. numpy.random.shuffle() modifica o array de índices recebido; nestes exemplos, ele não embaralha diretamente os arrays de origem. Em todos os casos, a correspondência só é preservada se todos os arrays relacionados usarem a mesma ordem.

Para obter reprodutibilidade, guarde o array de índices gerado e aplique-o novamente aos arrays originais, ou salve-o junto aos dados. Reutilizar a mesma ordem de índices recria a mesma disposição sem depender de uma API de estado aleatório que não foi especificada. Se precisar de um novo embaralhamento independente, gere outra ordem. Os exemplos não prometem uma ordem impressa específica.