2013-08-12 25 views
5

Sono ben consapevole che there are differences between lists and tuples e che tuples aren't just constant lists, ma ci sono pochi esempi in cui i due sono in realtà trattato in modo diverso dal codice di (in contrasto con da una convenzione di codifica), così ho (sloppily) li hanno usati in modo intercambiabile.List e tuple si comportano in modo diverso

Poi mi sono imbattuto in un caso in cui essi danno un comportamento totalmente diverso:

>>> import numpy as np 
>>> a = np.arange(9).reshape(3,3) 
>>> a 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
>>> idx = (1,1) 
>>> a[idx] 
4 
>>> idx = [1,1] 
>>> a[idx] 
array([[3, 4, 5], 
     [3, 4, 5]]) 

qualcuno può spiegare cosa sta succedendo qui? Ancora più importante, in quale altro posto questa sciagura appare in scipy?

risposta

4

Hai trovato un comportamento diverso perché, in NumPy, tre tipi di indicizzazione sono supportati

  • base affettare
  • indicizzazione avanzata
  • Record di accesso

Utilizzando tupla per l'indicizzazione è è solo equivalente a un elenco di parametri, che è suffisso come Slicing di base, in cui, poiché l'utilizzo di un elenco simile a una non tupla risulta in Indicizzazione avanzata.

ricordiamo Inoltre, dal documentation

indicizzazione avanzata viene attivato quando l'oggetto di selezione, obj, è un oggetto sequenza non tupla, un ndarray (di tipo di dati intero o bool), o tupla con almeno un oggetto sequenza o narray (del tipo di dati integer o bool). Esistono due tipi di indicizzazione avanzata: intero e booleano.

L'indicizzazione avanzata restituisce sempre una copia dei dati (contrasto con lo slicing di base che restituisce una vista).

E inoltre, dal medesimo documentazione

In Python, x [(exp1, exp2, ..., expN)] è equivalente a x [exp1, exp2, ..., expN]; quest'ultimo è solo zucchero sintattico per il primo.

+0

+1 la risposta è migliore, quindi rimuovo la risposta. – defuz

Problemi correlati