2011-10-03 40 views
6

Me gustaría lanzar un numpy ndarray objeto de forma (n,) en uno que tiene forma (n, 1). El mejor que he llegado con es rodar mi propia función _to_col:numpy: sintaxis/idioma para convertir (n,) matriz a una (n, 1) matriz?

def _to_col(a): 
    return a.reshape((a.size, 1)) 

pero es difícil para mí creer que una operación tan ubicua no está ya integrado en la sintaxis de numpy. Me imagino que no he podido encontrar la búsqueda de Google correcta para encontrarla.

Respuesta

9

que haría uso de lo siguiente:

a[:,np.newaxis] 

Una alternativa (pero quizás un poco menos claro) manera de escribir lo mismo es:

a[:,None] 

Todo lo anterior (incluyendo su versión) son operaciones de tiempo constante.

+0

Para añadir un eje al extremo de una matriz nd 2d o superior, utilizar una elipsis lugar de dos puntos: 'a [..., None]' que cubre tantas dimensiones como sea necesario. Entonces 'a.shape' irá de, por ejemplo,' (n, m) 'a' (n, m, 1) '. – askewchan

2

np.expand_dims es mi favorito cuando quiero agregar un eje arbitrario.

Ninguno o np.newaxis es bueno para el código que no necesita tener un eje flexible. (Respuesta de Aix)

>>> np.expand_dims(np.arange(5), 0).shape 
(1, 5) 
>>> np.expand_dims(np.arange(5), 1).shape 
(5, 1) 

Ejemplo de uso: degradar una matriz por cualquier eje dado

>>> x = np.random.randn(4,5) 
>>> x - x.mean(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 


>>> ax = 1 
>>> x - np.expand_dims(x.mean(ax), ax) 
array([[-0.04152658, 0.4229244 , -0.91990969, 0.91270622, -0.37419434], 
     [ 0.60757566, 1.09020783, -0.87167478, -0.22299015, -0.60311856], 
     [ 0.60015774, -0.12358954, 0.33523495, -1.1414706 , 0.32966745], 
     [-1.91919832, 0.28125008, -0.30916116, 1.85416974, 0.09293965]]) 
>>> ax = 0 
>>> x - np.expand_dims(x.mean(ax), ax) 
array([[ 0.15469413, 0.01319904, -0.47055919, 0.57007525, -0.22754506], 
     [ 0.70385617, 0.58054228, -0.52226447, -0.66556131, -0.55640947], 
     [ 1.05009459, -0.27959876, 1.03830159, -1.23038543, 0.73003287], 
     [-1.90864489, -0.31414256, -0.04547794, 1.32587149, 0.05392166]]) 
Cuestiones relacionadas