2011-01-27 8 views
2

私は112行と40列の配列を持っています。Numpy:最小の操作数でこのアレイを作り直す

私が変換する必要があるフォーマットは、x、yのそれぞれ56ポイントの40セットです。

したがって、最初の行には、各セットの最初の点のx座標があります。 2行目は、セット内の2番目の点のxを56行目まで持ちます。その後、私はyを持っています。

1st line : 40 x's 
2nd line: 40 x's 
... 
56th line: 40 x's 
57th line: 40 y's 
... 
112th line: 40 y's 

は当初、私はdata.reshape(40, 56, 2)をすることについて考えたが、xの値がyの値の前に来るので、それは動作しません。代わりに、私はxとyの1つの行があっても動作します。

編集:

for i in xrange(len(data)/2): 
    points.append(data[i]) 
    points.append(data[i+len(data)/2]) 
points = np.array(points).T.reshape(len(data[0]), len(data)/2, 2) 
return points 

答えて

4

ただ1アイデア:

[[(data[i,j], data[i+56,j]) for i in range(56)] for j in range(40)] 

はタプルのリストのリストを返します。

編集:あなたの編集は、あなたが望むものを明確にします。あなたが純粋なナンシーを望むなら、これはうまくいくのですか?

data.reshape(2, 56, 40).swapaxes(0,2) 
+0

これは私が探していたものです。ありがとう。あなたは0と2を使った理由を私に説明できますか? – pnodbnda

+0

試行錯誤。 :-) 'reshape'は私を混乱させます。特にMatlabはデフォルトで列方向を横断するので、Numpyはデフォルトで横列を横断します。健全性チェックとして、numpy.arange(112 * 40).reshape(112,40)を作成します。次に、それを再形成し、要素が所望の出力と一致するかどうかチェックします。 –

+0

私はそれを得た。それは3次元なので、スワップすると0と2を入れ替えると、2と40が入れ替わります。つまり、配列が得られます。40 x 56 x 2 – pnodbnda

2

返された値を簡単に表示できるように、私は小さな配列(8 x 5)を使用します。

import numpy as NP 

# just create a smaller array to work with: 
A = NP.random.randint(0, 10, 40).reshape(8, 5) 

# split A in half, to separate x and y 
p, q = NP.vsplit(A, 2) 

# create a 'template' array of the correct dimension 
xy = NP.zeros(2, 4, 5) 

# now just map the x and y values onto the template 
xy[0:,:] = p 
xy[1:,:] = q 


# the transformed matrix: 
array([[[ 8., 5., 2., 5., 7.], 
     [ 2., 6., 0., 7., 2.], 
     [ 4., 4., 7., 5., 5.], 
     [ 8., 5., 2., 0., 5.]], 

     [[ 4., 8., 6., 9., 2.], 
     [ 2., 6., 5., 8., 1.], 
     [ 3., 2., 6., 2., 2.], 
     [ 1., 8., 0., 7., 3.]]])