En números, ¿qué hace la selección por ?

Estoy tomando el curso de Udacity sobre aprendizaje profundo y encontré el siguiente código:

def reformat(dataset, labels): dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32) # Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...] labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32) return dataset, labels 

¿Qué hacen realmente aquí las labels[:,None] ?

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

numpy.newaxis

El objeto newaxis se puede utilizar en todas las operaciones de corte para crear un eje de longitud uno. : const: newaxis es un alias para ‘Ninguno’, y ‘Ninguno’ puede usarse en lugar de esto con el mismo resultado.

http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.expand_dims.html

Demostrando con parte de tu código

 In [154]: labels=np.array([1,3,5]) In [155]: labels[:,None] Out[155]: array([[1], [3], [5]]) In [157]: np.arange(8)==labels[:,None] Out[157]: array([[False, True, False, False, False, False, False, False], [False, False, False, True, False, False, False, False], [False, False, False, False, False, True, False, False]], dtype=bool) In [158]: (np.arange(8)==labels[:,None]).astype(int) Out[158]: array([[0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]]) 

None es un alias para NP.newaxis . Crea un eje con longitud 1. Esto puede ser útil para la multiplicación de matrices, etc.

 >>>> import numpy as NP >>>> a = NP.arange(1,5) >>>> print a [1 2 3 4] >>>> print a.shape (4,) >>>> print a[:,None].shape (4, 1) >>>> print a[:,None] [[1] [2] [3] [4]] 

Vine aquí después de tener exactamente el mismo problema haciendo el mismo curso de Udacity. Lo que quería hacer es transponer la serie / matriz numpy unidimensional que no funciona con numpy.transpose ([1, 2, 3]). Así que quería agregar que puedes transponer así ( fuente ):

 numpy.matrix([1, 2, 3]).T 

En resultado de:

 matrix([[1], [2], [3]]) 

que es prácticamente idéntico (el tipo es diferente) a:

 x=np.array([1, 2, 3]) x[:,None] 

Pero creo que es más fácil de recordar …

Para explicarlo en inglés simple, permite operaciones entre dos matrices de diferente número de dimensiones.

Para ello, agrega una nueva dimensión vacía que se ajustará automáticamente al tamaño de la otra matriz.

Así que básicamente si:

Array1 = forma [100] y Array2 = forma [10,100]

Array1 * Array2 normalmente dará un error.

Array1[:,None] * Array2 funcionará.