Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use of None in Array indexing in Python

Tags:

I am using the LSTM tutorial for Theano (http://deeplearning.net/tutorial/lstm.html). In the lstm.py (http://deeplearning.net/tutorial/code/lstm.py) file, I don't understand the following line:

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

What does m_[:, None] mean? In this case m_ is the theano vector while c is a matrix.

like image 601
nisace Avatar asked Jul 18 '15 15:07

nisace


People also ask

What does index None mean in Python?

With NumPy.array slicing, None is the same as the newaxis object which adds an axis (dimension) to an array so m_[:, None] wraps each element of m_ in an array, e.g. given import numpy as np; a = np.array([[1,2],[3,4]]), then a[:,None] is np.array([[[1, 2]], [[3, 4]]])

What does None mean in an array?

None is used to define a variable so that it resets to a variable with no value. It is not similar to a NULL or an empty string, None is an object.

What is none in NumPy array?

None is an alias for NP. newaxis. It creates an axis with length 1. This can be useful for matrix multiplcation etc.

What is the difference between indexing and slicing in Python?

“Indexing” means referring to an element of an iterable by its position within the iterable. “Slicing” means getting a subset of elements from an iterable based on their indices.


2 Answers

This question has been asked and answered on the Theano mailing list, but is actually about the basics of numpy indexing.

Here are the question and answer https://groups.google.com/forum/#!topic/theano-users/jq92vNtkYUI

For completeness, here is another explanation: slicing with None adds an axis to your array, see the relevant numpy documentation, because it behaves the same in both numpy and Theano:

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

Note that 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) 

Typically this is used to adjust shapes to be able to broadcast to higher dimensions. E.g. tiling 7 times in the middle axis can be achieved as

b = a[:, np.newaxis] * np.ones((1, 7, 1))  print b.shape  # yields (5, 7, 6), 7 copies of a along the second axis 
like image 129
eickenberg Avatar answered Sep 28 '22 22:09

eickenberg


I think the Theano vector's __getitem__ method expects a tuple as an argument! like this:

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] 

Here print a[0,2] when a is an ordinary list will raise an exception:

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

But here the __getitem__ method is different and it accepts a tuple as an argument.

You can pass the : sign to __getitem__ like this as : means 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] 

Speaking about None, it can be used when indexing in plain Python as well:

>>> 'hello'[None:None] 'hello' 
like image 24
ForceBru Avatar answered Sep 28 '22 22:09

ForceBru