2015-07-18 7 views
12

Sto utilizzando il tutorial LSTM per Theano (http://deeplearning.net/tutorial/lstm.html). Nel file lstm.py (http://deeplearning.net/tutorial/code/lstm.py), non capisco la seguente riga:Uso di Nessuno nell'indicizzazione di matrice in Python

c = m_[:, None] * c + (1. - m_)[:, None] * c_ 

Cosa m_[:, None] significa? In questo caso m_ è il vettore theano mentre c è una matrice.

+0

Non ho lavorato con Theano, ma sembra che ha una stretta integrazione con NumPy, che introduce la sintassi si sta trattando: http: // docs. scipy.org/doc/numpy/reference/arrays.indexing.html –

+2

Ondrej Slinták è corretto. Guardando il codice in https://github.com/Theano/Theano, i tensori di Theano sono implementati come array NumPy e lstm.py mostra che slice() restituisce un array NumPy a 2 o 3 dimensioni. Con l'affettatura NumPy.array, None è uguale all'oggetto newaxis che aggiunge un asse (dimensione) a un array, quindi m_ [:, None] avvolge ciascun elemento di m_ in un array, ad es. dato import numpy come np; a = np.array ([[1,2], [3,4]]), quindi a [:, None] è np.array ([[[1, 2]], [[3, 4]]]) –

+0

Assicurati di fare un tutorial di numpy di base seguito dal tutorial di Theano. Questo risponderà a molte domande. – eickenberg

risposta

7

Questa domanda è stata posta e ha risposto alla mailing list di Theano, ma in realtà riguarda le nozioni di base sull'indicizzazione numpy.

Ecco la domanda e la risposta https://groups.google.com/forum/#!topic/theano-users/jq92vNtkYUI

Per completezza, ecco un'altra spiegazione: affettare con None aggiunge un asse per l'array, consultare la documentazione NumPy rilevante, perché si comporta lo stesso in entrambi i numpy e Theano :

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#numpy.newaxis

Nota che np.newaxis is None:

import numpy as np 
a = np.arange(30).reshape(5, 6) 

print a.shape # yields (5, 6) 
print a[np.newaxis, :, :].shape # yields (1, 5, 6) 
print a[:, np.newaxis, :].shape # yields (5, 1, 6) 
print a[:, :, np.newaxis].shape # yields (5, 6, 1) 

In genere viene utilizzato per regolare le forme per poter trasmettere a quote più alte. Per esempio. affiancamento 7 volte lungo l'asse centrale può essere realizzato come

b = a[:, np.newaxis] * np.ones((1, 7, 1)) 

print b.shape # yields (5, 7, 6), 7 copies of a along the second axis 
3

Penso che il metodo __getitem__ del vettore Theano si aspetti una tupla come argomento! in questo modo:

class Vect (object): 
    def __init__(self,data): 
     self.data=list(data) 

    def __getitem__(self,key): 
     return self.data[key[0]:key[1]+1] 

a=Vect('hello') 
print a[0,2] 

Qui print a[0,2] quando a è una normale lista solleva un'eccezione:

>>> a=list('hello') 
>>> a[0,2] 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
TypeError: list indices must be integers, not tuple 

Ma qui il metodo __getitem__ è diverso e accetta una tupla come argomento.

È possibile passare il segno :-__getitem__ come questo come : significa fetta:

class Vect (object): 
    def __init__(self,data): 
     self.data=list(data) 

    def __getitem__(self,key): 
     return self.data[0:key[1]+1]+list(key[0].indices(key[1])) 

a=Vect('hello') 
print a[:,2] 

Parlando None, può essere utilizzato per l'indicizzazione in Python pianura così:

>>> 'hello'[None:None] 
'hello' 
+0

Infatti, chiamare 'a [:, 3]' su una lista ordinaria dà 'TypeError: gli indici di lista devono essere numeri interi, non tuple'. Tuttavia, non vedo davvero quale sia la tupla qui. Potresti elaborare un po '? – Rishav

+0

la tupla è la virgola: P Sì, la cosa reale in python che fa una tupla una tupla è una virgola, non i parens. Potresti scrivere un [(:, 3)] se vuoi essere più chiaro. – NightShadeQueen

+0

@NighShadeQueen wow non l'avrei mai immaginato. – Rishav

Problemi correlati