2012-10-05 229 views
49

我嘗試做以下,但與numpy的數組:Python的numpy中的「zip()」是什麼?

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

這應該給的結果是:

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

但如果輸入向量是一個numpy的數組:

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

它(預計)返回a:

<type 'list'> 

問題是我需要在此之後將結果轉換回numpy數組。

我想知道的是,如果有一個有效的numpy函數可以避免這些來回轉換,那會是什麼情況?

回答

72

你可以只轉吧...

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

嘗試使用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]]]) 

所以你的情況這將是:

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

增加一個額外的維度一個二維數組。如果你想要類似於OP所需的東西,你必須採用dstacked數組的第一個元素。 – benjwadams

+0

Numpy np.stack是矩陣中最接近拉鍊的。 'array =(x,y); np.stack(數組,軸= len(數組))'。 – CMCDragonkai

+2

還有np.column_stack,這可能是OP需要的。 – RecencyEffect

相關問題