pyplot - title matplotlib python




Mescola due liste contemporaneamente con lo stesso ordine (3)

Ho un modo semplice per farlo

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])

Sto usando nltk corpus movie_reviews dove ci sono molti documenti. Il mio compito è ottenere prestazioni predittive di queste revisioni con pre-elaborazione dei dati e senza pre-elaborazione. Ma c'è un problema, in liste documents e documents2 Ho gli stessi documenti e ho bisogno di mescolarli per mantenere lo stesso ordine in entrambe le liste. Non posso mescolarli separatamente perché ogni volta che mischio la lista ottengo altri risultati. Questo è il motivo per cui ho bisogno di mescolare il tutto nello stesso ordine perché ho bisogno di confrontarli alla fine (dipende dall'ordine). Sto usando Python 2.7

Esempio (in realtà le stringhe sono tokenizzate, ma non è relativa):

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')]

E ho bisogno di ottenere questo risultato dopo aver mescolato entrambe le liste:

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')]

Ho questo codice:

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

Mescola un numero arbitrario di elenchi contemporaneamente.

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)

Produzione:

$ (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:
gli oggetti restituiti da shuffle_list() sono tuples .

PS shuffle_list() può anche essere applicato a numpy.array()

a = np.array([1,2,3])
b = np.array([4,5,6])

a1,b1 = shuffle_list(a,b)
print(a1,b1)

Produzione:

$ (3, 1, 2) (6, 4, 5)

Puoi usare il secondo argomento della funzione shuffle per correggere l'ordine di mischiare.

Nello specifico, puoi passare al secondo argomento della funzione shuffle una funzione di argomento zero che restituisce un valore in [0, 1). Il valore di ritorno di questa funzione corregge l'ordine di mischiare. (Di default cioè se non si passa nessuna funzione come secondo argomento, usa la funzione random.random() . Puoi vederlo alla riga 277 here .)

Questo esempio illustra ciò che ho descritto:

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

Produzione:

['e', 'c', 'd', 'a', 'b']
[5, 3, 4, 1, 2]




shuffle