在 Python 中的数组索引中使用 None
Use of None in Array indexing in Python
我正在使用 Theano (http://deeplearning.net/tutorial/lstm.html). In the lstm.py (http://deeplearning.net/tutorial/code/lstm.py) 文件的 LSTM 教程,我不明白以下行:
c = m_[:, None] * c + (1. - m_)[:, None] * c_
m_[:, None]
是什么意思?在这种情况下,m_
是 theano 向量,而 c
是矩阵。
我认为 Theano 向量的 __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__
,因为 :
表示 slice:
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'
这个问题已经在 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
我正在使用 Theano (http://deeplearning.net/tutorial/lstm.html). In the lstm.py (http://deeplearning.net/tutorial/code/lstm.py) 文件的 LSTM 教程,我不明白以下行:
c = m_[:, None] * c + (1. - m_)[:, None] * c_
m_[:, None]
是什么意思?在这种情况下,m_
是 theano 向量,而 c
是矩阵。
我认为 Theano 向量的 __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__
,因为 :
表示 slice:
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'
这个问题已经在 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