2012-10-05 37 views
49

estoy tratando de hacer lo siguiente, pero con arreglos numpy:¿Cuál es el equivalente de "zip()" en el numpy de Python?

x = [(0.1, 1.), (0.1, 2.), (0.1, 3.), (0.1, 4.), (0.1, 5.)] 
normal_result = zip(*x) 

Esto debería dar un resultado de:

normal_result = [(0.1, 0.1, 0.1, 0.1, 0.1), (1., 2., 3., 4., 5.)] 

Pero si el vector de entrada es una matriz numpy:

y = np.array(x) 
numpy_result = zip(*y) 
print type(numpy_result) 

(esperado) devuelve un:

<type 'list'> 

El problema es que tendré que transformar el resultado en una matriz numpy después de esto.

Lo que me gustaría saber es qué hay si hay una función numpy eficiente que evitará estas transformaciones de ida y vuelta.

Respuesta

72

Puede simplemente la transposición ...

>>> a = np.array([(0.1, 1.), (0.1, 2.), (0.1, 3.), (0.1, 4.), (0.1, 5.)]) 
>>> a 
array([[ 0.1, 1. ], 
     [ 0.1, 2. ], 
     [ 0.1, 3. ], 
     [ 0.1, 4. ], 
     [ 0.1, 5. ]]) 
>>> a.T 
array([[ 0.1, 0.1, 0.1, 0.1, 0.1], 
     [ 1. , 2. , 3. , 4. , 5. ]]) 
31

Trate de usar dstack:

>>> from numpy import * 
>>> a = array([[1,2],[3,4]]) # shapes of a and b can only differ in the 3rd dimension (if present) 
>>> b = array([[5,6],[7,8]]) 
>>> dstack((a,b)) # stack arrays along a third axis (depth wise) 
array([[[1, 5], 
     [2, 6]], 
     [[3, 7], 
     [4, 8]]]) 

por lo que en su caso sería:

x = [(0.1, 1.), (0.1, 2.), (0.1, 3.), (0.1, 4.), (0.1, 5.)] 
y = np.array(x) 
np.dstack(y) 

>>> array([[[ 0.1, 0.1, 0.1, 0.1, 0.1], 
    [ 1. , 2. , 3. , 4. , 5. ]]]) 
+2

añade una dimensión extra a una matriz 2d. Si desea algo similar a lo que OP quería, tendrá que tomar el primer elemento de la matriz dstacked. – benjwadams

+0

Numpy np.stack es lo más cercano a zip para matrices. 'arrays = (x, y); np.stack (matrices, eje = len (matrices)) '. – CMCDragonkai

+2

También hay np.column_stack, que puede ser lo que OP necesita. – RecencyEffect

Cuestiones relacionadas