python - array - Mezclar dos listas a la vez con el mismo orden
shuffle list c# (4)
Estoy utilizando la compilación nltk corpus movie, donde hay muchos documentos. Mi tarea es obtener el rendimiento predictivo de estas revisiones con el procesamiento previo de los datos y sin el procesamiento previo. Pero hay un problema, en las listas documents
y documents2
Tengo los mismos documentos y necesito mezclarlos para mantener el mismo orden en ambas listas. No puedo barajarlos por separado, porque cada vez que mezclo la lista, obtengo otros resultados. Es por eso que necesito barajar el mismo orden de una vez porque necesito compararlos al final (depende del orden). Estoy usando python 2.7
Ejemplo (en real, las cadenas están tokenizadas, pero no son relativas):
documents = [([''plot : two teen couples go to a church party , ''], ''neg''),
([''drink and then drive . ''], ''pos''),
([''they get into an accident . ''], ''neg''),
([''one of the guys dies''], ''neg'')]
documents2 = [([''plot two teen couples church party''], ''neg''),
([''drink then drive . ''], ''pos''),
([''they get accident . ''], ''neg''),
([''one guys dies''], ''neg'')]
Y necesito obtener este resultado después de barajar ambas listas:
documents = [([''one of the guys dies''], ''neg''),
([''they get into an accident . ''], ''neg''),
([''drink and then drive . ''], ''pos''),
([''plot : two teen couples go to a church party , ''], ''neg'')]
documents2 = [([''one guys dies''], ''neg''),
([''they get accident . ''], ''neg''),
([''drink then drive . ''], ''pos''),
([''plot two teen couples church party''], ''neg'')]
Tengo este codigo
def cleanDoc(doc):
stopset = set(stopwords.words(''english''))
stemmer = nltk.PorterStemmer()
clean = [token.lower() for token in doc if token.lower() not in stopset and len(token) > 2]
final = [stemmer.stem(word) for word in clean]
return final
documents = [(list(movie_reviews.words(fileid)), category)
for category in movie_reviews.categories()
for fileid in movie_reviews.fileids(category)]
documents2 = [(list(cleanDoc(movie_reviews.words(fileid))), category)
for category in movie_reviews.categories()
for fileid in movie_reviews.fileids(category)]
random.shuffle( and here shuffle documents and documents2 with same order) # or somehow
Baraja un número arbitrario de listas simultáneamente.
from random import shuffle
def shuffle_list(*ls):
l =list(zip(*ls))
shuffle(l)
return zip(*l)
a = [0,1,2,3,4]
b = [5,6,7,8,9]
a1,b1 = shuffle_list(a,b)
print(a1,b1)
a = [0,1,2,3,4]
b = [5,6,7,8,9]
c = [10,11,12,13,14]
a1,b1,c1 = shuffle_list(a,b,c)
print(a1,b1,c1)
Salida:
$ (0, 2, 4, 3, 1) (5, 7, 9, 8, 6)
$ (4, 3, 0, 2, 1) (9, 8, 5, 7, 6) (14, 13, 10, 12, 11)
Nota:
los objetos devueltos por shuffle_list()
son tuples
.
PS shuffle_list()
también se puede aplicar a numpy.array()
a = np.array([1,2,3])
b = np.array([4,5,6])
a1,b1 = shuffle_list(a,b)
print(a1,b1)
Salida:
$ (3, 1, 2) (6, 4, 5)
Me sale una manera fácil de hacer esto
import numpy as np
a = np.array([0,1,2,3,4])
b = np.array([5,6,7,8,9])
indices = np.arange(a.shape[0])
np.random.shuffle(indices)
a = a[indices]
b = b[indices]
# a, array([3, 4, 1, 2, 0])
# b, array([8, 9, 6, 7, 5])
Puede utilizar el segundo argumento de la función de orden aleatorio para corregir el orden de orden aleatorio.
Específicamente, puede pasar el segundo argumento de la función de reproducción aleatoria a una función de argumento cero que devuelve un valor en [0, 1). El valor de retorno de esta función corrige el orden de barajado. (De manera predeterminada, es decir, si no pasa ninguna función como segundo argumento, usa la función random.random()
. Puede verla en la línea 277 here ).
Este ejemplo ilustra lo que describí:
import random
a = [''a'', ''b'', ''c'', ''d'', ''e'']
b = [1, 2, 3, 4, 5]
r = random.random() # randomly generating a real in [0,1)
random.shuffle(a, lambda : r) # lambda : r is an unary function which returns r
random.shuffle(b, lambda : r) # using the same function as used in prev line so that shuffling order is same
print a
print b
Salida:
[''e'', ''c'', ''d'', ''a'', ''b'']
[5, 3, 4, 1, 2]
Puedes hacerlo como:
import random
a = [''a'', ''b'', ''c'']
b = [1, 2, 3]
c = list(zip(a, b))
random.shuffle(c)
a, b = zip(*c)
print a
print b
[OUTPUT]
[''a'', ''c'', ''b'']
[1, 3, 2]
Por supuesto, este fue un ejemplo con listas más simples, pero la adaptación será la misma para su caso.
Espero eso ayude. Buena suerte.