Использование None в индексировании массива в Python
Я использую учебник LSTM для Theano (http://deeplearning.net/tutorial/lstm.html). В файле lstm.py(http://deeplearning.net/tutorial/code/lstm.py я не понимаю следующую строку:
c = m_[:, None] * c + (1. - m_)[:, None] * c_
Что означает m_[:, None]
? В этом случае m_
является вектором anano, а c
- матрицей.
Ответы
Ответ 1
Этот вопрос задан и ответил на список рассылки Theano, но на самом деле об основах индексирования numpy.
Вот вопрос и ответ
https://groups.google.com/forum/#!topic/theano-users/jq92vNtkYUI
Для полноты, вот еще одно объяснение: нарезка с помощью None
добавляет ось в ваш массив, см. соответствующую документацию по количеству, поскольку она ведет себя одинаково как в numpy, так и в Theano:
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
Ответ 2
Я думаю, что метод Anano 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'