Jaroslav Klimcic
estoy usando el nltk
de la biblioteca movie_reviews
corpus que contiene una gran cantidad de documentos. Mi tarea es obtener un rendimiento predictivo de estas revisiones con preprocesamiento de los datos y sin preprocesamiento. Pero hay problema, en las listas documents
y documents2
Tengo los mismos documentos y necesito mezclarlos para mantener el mismo orden en ambas listas. No puedo barajarlas por separado porque cada vez que barajo la lista obtengo otros resultados. Es por eso que necesito mezclarlos a la vez con el mismo orden porque necesito compararlos al final (depende del orden). estoy usando python 2.7
Ejemplo (en realidad, las cadenas están tokenizadas, pero no es relativo):
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 mezclar 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
sshashank124
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 era un ejemplo con listas más simples, pero la adaptación será la misma para tu caso.
-
Gracias, eso es exactamente lo que necesito.
– Jaroslav Klimčík
25 de abril de 2014 a las 10:15
-
(pregunta de novato): ¿qué significa *?
– ᔕᖺᘎᕊ
2 abr 2015 a las 16:18
-
@ᔕᖺᘎᕊ, significa descomprimir los valores de c para que se llame como
zip(1,2,3)
en vez dezip([1,2,3])
– sshashank124
3 de abril de 2015 a las 1:21
-
Usé esta solución antes y
a
yb
eran listas al final. Con Python 3.6.8, al final del mismo ejemplo, obtengoa
yb
como tuplas.– Vinzee
23 de febrero de 2019 a las 16:52
-
…Tuplas… así que solo a=lista(a) y b=lista(b)
– RichardBJ
9 de mayo de 2019 a las 13:07
Tengo 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])
-
La publicación original trata sobre listas normales en python, pero necesitaba una solución para matrices numpy. ¡Acabas de salvar mi día!
– finngu
9 de noviembre de 2018 a las 16:39
-
Parece que
np.random.permutation(a.shape[0])
seria mas sencillo– Itay
9 de noviembre de 2021 a las 11:47
-
Me salvó el día para revertirlo. Utilice inverse_perm = np.argsort(permutación) y np.array(my_array)[inverse_perm] para revertirlo.
– trinidad420
4 abr a las 12:47
YScharf
from sklearn.utils import shuffle
a = ['a', 'b', 'c','d','e']
b = [1, 2, 3, 4, 5]
a_shuffled, b_shuffled = shuffle(np.array(a), np.array(b))
print(a_shuffled, b_shuffled)
#random output
#['e' 'c' 'b' 'd' 'a'] [5 3 2 4 1]
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)
Producción:
$ (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:
objetos devueltos por shuffle_list()
son tuples
.
PD
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)
Producción:
$ (3, 1, 2) (6, 4, 5)
Una manera fácil y rápida de hacer esto es usar random.seed() con random.shuffle() . Te permite generar el mismo orden aleatorio tantas veces como quieras. Se verá así:
a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]
seed = random.random()
random.seed(seed)
a.shuffle()
random.seed(seed)
b.shuffle()
print(a)
print(b)
>>[3, 1, 4, 2, 5]
>>[8, 6, 9, 7, 10]
Esto también funciona cuando no puede trabajar con ambas listas al mismo tiempo debido a problemas de memoria.
-
¿No debería ser random.shuffle(a) ?
– Kan
2 jun 2020 a las 22:10
-
pienso
getstate/setstate
funcionaría mejor que asignar una semilla en particular.– pjs
25 de marzo de 2021 a las 15:54
D_00
Puede almacenar el orden de los valores en una variable y luego ordenar las matrices simultáneamente:
array1 = [1, 2, 3, 4, 5]
array2 = ["one", "two", "three", "four", "five"]
order = range(len(array1))
random.shuffle(order)
newarray1 = []
newarray2 = []
for x in range(len(order)):
newarray1.append(array1[order[x]])
newarray2.append(array2[order[x]])
print newarray1, newarray2
-
¿No debería ser random.shuffle(a) ?
– Kan
2 jun 2020 a las 22:10
-
pienso
getstate/setstate
funcionaría mejor que asignar una semilla en particular.– pjs
25 de marzo de 2021 a las 15:54
T-perro
Esto funciona también:
import numpy as np
a = ['a', 'b', 'c']
b = [1, 2, 3]
rng = np.random.default_rng()
state = rng.bit_generator.state
rng.shuffle(a)
# use same seeds for a & b!
rng.bit_generator.state = state # set state to same state as before
rng.shuffle(b)
print(a)
print(b)
Producción:
['b', 'a', 'c']
[2, 1, 3]
Posible duplicado de Mejor manera de barajar dos matrices numpy al unísono
–Rick Smith
30/04/2018 a las 21:50