2015-07-18 3 views
12

Я использую учебник LSTM для Theano (http://deeplearning.net/tutorial/lstm.html). В файле lstm.py (http://deeplearning.net/tutorial/code/lstm.py), я не понимаю, следующую строку:Использование None в индексировании массива в Python

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

Что m_[:, None] значит? В этом случае m_ является вектором anano, а c - матрицей.

+0

Я не работал с Теано, но мне кажется, что имеет тесную интеграцию с NumPy, который вводит синтаксис вы имеете дело с: HTTP: // Docs. scipy.org/doc/numpy/reference/arrays.indexing.html –

+2

Ondrej Slinták верен. Рассматривая код в https://github.com/Theano/Theano, тензоры Theano реализуются как массивы NumPy, а lstm.py показывает, что slice() возвращает 2 или 3 мерный массив NumPy. При нарезке NumPy.array None - это то же самое, что и объект newaxis, который добавляет ось (измерение) в массив, поэтому m_ [:, None] обертывает каждый элемент m_ в массиве, например. заданный импорт numpy как np; a = np.array ([[1,2], [3,4]]), тогда a [:, None] является np.array ([[[1, 2]], [[3, 4]]]) –

+0

Удостоверьтесь, что вы делаете базовый учебник numpy, за которым следует учебник Theano. Это ответит на множество вопросов. – eickenberg

ответ

7

Этот вопрос задан и отвечает на список рассылки Theano, но на самом деле об основах индексации numpy.

Вот вопрос и ответ https://groups.google.com/forum/#!topic/theano-users/jq92vNtkYUI

Для полноты, вот еще одно объяснение: нарезка с None добавляет ось в массив, смотрите соответствующую документацию Numpy, потому что она ведет себя так же, как в NumPy и Теано :

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

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) 

Обычно это используется для настройки форм, позволяющих передавать их в более высокие размеры. Например. облицовочные 7 раз в средней оси может быть достигнута

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

Я думаю, что метод Theano vector __getitem__ ожидает кортеж в качестве аргумента! как это:

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] Вот когда a обычный список сгенерирует исключение:

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

Но здесь метод __getitem__ отличается и принимает кортеж в качестве аргумента.

Вы можете передать : знак __getitem__ как это как : означает ломтик:

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] 

Говоря о None, он может быть использован при индексации в простом Python, а также:

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

Действительно, вызов 'a [:, 3]' в обычном списке дает 'TypeError: индексы списка должны быть целыми числами, а не tuple'. Однако я не вижу, что такое кортеж. Не могли бы вы немного разобраться? – Rishav

+0

Кортеж - это запятая: P Да, реальная вещь в питоне, которая делает кортеж, является запятой, а не parens. Вы могли бы написать это [(:, 3)], если бы вы хотели быть более ясными. – NightShadeQueen

+0

@NighShadeQueen ничего себе я бы никогда не догадался. – Rishav

Смежные вопросы