2012-10-05 10 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) 

(該当する)は次のようになります。

<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

に余分な次元を追加します。 2次元配列。 OPが望むものに似たものが欲しいなら、dstacked配列の最初の要素を取らなければなりません。 – benjwadams

+0

Numpy np.stackは、zipに最も近い行列です。 'arrays =(x、y); np.stack(配列、軸= len(配列)) '。 – CMCDragonkai

+2

np.column_stackもあります。これはOPに必要なものです。 – RecencyEffect

関連する問題