2013-03-26 10 views
9

Immaginate una serie numpy, ad es. x = np.linspace(1,10).Quale valore devo usare in un intervallo di porzioni per includere l'ultimo valore in una matrice numpy?

x[i:j] mi dà una vista in x per l'intervallo [i,j). Mi piace il fatto che posso anche fare x[i:-k] che esclude gli ultimi k elementi.

Tuttavia, al fine di includere l'ultimo elemento che ho bisogno di fare x[i:].

La mia domanda è questa: come posso combinare queste due notazioni se per esempio ho bisogno di eseguire il ciclo su k.

dire che io voglio fare questo:

l = list() 
for k in [5,4,3,2,1]: 
    l.append(x[:-k]) 
l.append(x[:]) 

Quello che mi infastidisce è che nell'ultima riga. In questo semplice esempio, naturalmente, non fa molta differenza, ma a volte diventa molto più fastidioso. Quello che mi manca è qualcosa di più SECCO.

Il seguente frammento di corso non produce il risultato desiderato, ma rappresenta lo stile di codice che cerco:

l = list() 
for k in [5,4,3,2,1,0]: 
    l.append(x[:-k]) 

Grazie a advaned.

+0

che modo il risultato prodotto da quell'ultimo frammento differiscono da risultato desiderato? Non sono del tutto chiaro su cosa stai effettivamente cercando di produrre. –

+0

@MattBall L'ultimo snippet, quando 'k = 0', valuterà' x [: - 0] ', che è un array vuoto, invece di' x [:] 'che è l'array completo. – lxop

+0

possibile duplicato di [liste/matrici Python: disabilita l'indicizzazione negativa a fette] (http://stackoverflow.com/questions/13410615/python-lists-arrays-disable-negative-indexing-wrap-around-in- slice) – wim

risposta

8

E 'un po' di dolore, ma dal momento che -0 è lo stesso di 0 , non esiste una soluzione facile.

Un modo per farlo sarebbe:

l = list() 
for k in [5,4,3,2,1,0]: 
    l.append(x[:-k or None]) 

Questo perché quando k è 0, è -k or NoneNone, e x[:None] farà quello che vuoi. Per gli altri valori di k, -k or None sarà -k.

Non sono sicuro che mi piaccia anch'io.

0

Forse questo, allora:

l = list() 
for k in [5,4,3,2,1,None]: 
    l.append(x[:-k if k else None]) 

Se x è semplicemente range(10), il codice sopra produrrà:

[[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4, 5], 
[0, 1, 2, 3, 4, 5, 6], 
[0, 1, 2, 3, 4, 5, 6, 7], 
[0, 1, 2, 3, 4, 5, 6, 7, 8], 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]  
4

Il valore None, in una sezione, equivale a non inserire nulla. In altre parole, x[:None] corrisponde a x[:]. Quindi:

l = list() 
for k in [-5,-4,-3,-2,-1,None]: 
    l.append(x[:k]) 

Tuttavia ... questo codice è molto più facile da scrivere come una lista di comprensione:

l = [x[:k] for k in (-5,-4,-3,-2,-1,None)] 

Oppure ... si potrebbe desiderare di guardare ciò che è si sta cercando di fare e vedere se c'è un'astrazione di livello superiore che ha senso, o forse solo un altro modo per organizzare le cose che sono più leggibili (anche se è un po 'più verboso).Ad esempio, a seconda di cosa x rappresenta in realtà, questo potrebbe essere più comprensibile (o potrebbe essere meno, ovviamente):

l = [] 
for k in range(6): 
    l.insert(0, x) 
    x = x[:-1] 
8

Non è possibile, perché -0 non tagliare in questo modo in python (diventa 0)

si può solo fare la vecchia scuola:

l = list() 
for k in [5,4,3,2,1,0]: 
    l.append(x[:len(x)-k]) 
+0

+1 quando ho avuto questo stesso problema, questa era la soluzione più semplice e chiara – wim

Problemi correlati