2015-07-18 14 views
12

Ich verwende das LSTM-Tutorial für Theano (http://deeplearning.net/tutorial/lstm.html). Im lstm.py (http://deeplearning.net/tutorial/code/lstm.py) Datei, verstehe ich nicht, die folgende Zeile:Verwendung von None in Array-Indizierung in Python

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

Was bedeutet m_[:, None]? In diesem Fall ist m_ der Theano-Vektor, während c eine Matrix ist.

+0

Ich habe nicht mit Theano, aber es scheint, es hat eine enge Integration mit NumPy, die stellt die Syntax, die Sie beschäftigen sich mit gearbeitet erreicht werden. scipy.org/doc/numpy/reference/arrays.indexing.html –

+2

Ondrej Slinták ist korrekt. Wenn Sie den Code in https://github.com/Theano/Theano betrachten, werden Theano-Tensoren als NumPy-Arrays implementiert und lstm.py zeigt, dass slice() ein 2- oder 3-dimensionales NumPy-Array zurückgibt. Beim NumPy.array-Slicing stimmt None mit dem newaxis-Objekt überein, das einem Array eine Achse (Dimension) hinzufügt, so dass m_ [:, None] jedes Element von m_ in ein Array, z. gegeben import numpy als np; a = np.array ([[1,2], [3,4]]), dann ist a [:, None] np.array ([[[1, 2]], [[3, 4]]]) –

+0

Stellen Sie sicher, ein grundlegendes numpy Tutorial zu tun, das vom Theano Tutorium gefolgt wird. Das wird viele Fragen beantworten. – eickenberg

Antwort

7

Diese Frage wurde auf der Theano-Mailingliste gestellt und beantwortet, bezieht sich aber auf die Grundlagen der numpigen Indexierung.

Hier ist die Frage und https://groups.google.com/forum/#!topic/theano-users/jq92vNtkYUI

Für Vollständigkeit beantworten, hier ist eine andere Erklärung: Schneiden mit None eine Achse Array ergänzt die entsprechende numpy Dokumentation sehen, weil es das gleiche in beiden numpy und Theano verhält :

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

Beachten Sie, dass 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 der Regel werden damit Shapes angepasst, um in höhere Dimensionen übertragen zu können. Z.B. http: // docs Fliesen 7 mal in der Mittelachse als

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

Ich glaube, die Theano Vektor __getitem__ Methode erwartet ein Tupel als Argument! wie folgt aus:

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] 

print a[0,2] Hier wenn a eine gewöhnliche Liste ist eine Ausnahme erhöhen wird:

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

Aber hier ist die __getitem__ Methode ist anders und es nimmt ein Tupel als Argument.

Sie können die : Zeichen __getitem__ wie dies passieren, wie : bedeutet Scheibe:

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] 

Sprechen über None, kann es verwendet werden, wenn auch in einfachen Python indizieren:

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

Wenn man 'a [: 3]' auf einer gewöhnlichen Liste aufruft, ergibt sich 'TypeError: list indices inggers, not tuple'. Allerdings sehe ich nicht wirklich, was das Tupel hier ist. Könntest du ein wenig näher ausführen? – Rishav

+0

das Tupel ist das Komma: P Ja, die eigentliche Sache in Python, die ein Tupel ein Tupel macht, ist ein Komma, nicht die Parens. Sie könnten ihm vielleicht ein [(:, 3)] schreiben, wenn Sie klarer werden wollten. – NightShadeQueen

+0

@NighShadeQueen wow, ich hätte das nie gedacht. – Rishav

Verwandte Themen