2011-01-27 3 views
2

저는 112 줄과 40 컬럼을 가진 배열을 가지고 있습니다.Numpy : 최소한의 작업으로이 배열을 변형하십시오.

변환해야하는 형식은 각각 x, y가있는 56 점의 40 세트입니다.

그래서 첫 번째 줄에는 각 집합의 첫 번째 점에 대한 x 좌표가 있습니다. 두 번째 줄에는 두 번째 줄 중 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가있는 줄을 하나씩 사용하면 효과가 있습니다.

편집 :

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

그냥 하나 개의 아이디어 :

[[(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) .extape (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.]]]) 
관련 문제