在Python中的数组索引中使用None

时间:2015-07-18 15:30:57

标签: python theano

我正在使用Theano的LSTM教程(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_是theano向量,而c是矩阵。

2 个答案:

答案 0 :(得分:9)

在Theano邮件列表中已经提出并回答了这个问题,但实际上是关于numpy索引的基础知识。

以下是问题和答案 https://groups.google.com/forum/#!topic/theano-users/jq92vNtkYUI

为了完整性,这里有另一种解释:使用None切片为您的数组添加一个轴,请参阅相关的numpy文档,因为它在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

答案 1 :(得分:4)

我认为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'