2012-12-12 2 views
0

열 또는 행 이름이없는 배열이 여러 개 있습니다. numpy.vstack() 또는 numpy.hstack()과 같은 것을 사용하여 배열을 결합하고 싶습니다.열 및 행 레이블을 병합 된 numpy 배열에 할당 하시겠습니까?

when creating a structured array 열과 행 레이블을 지정할 수 있지만 hstackvstack에는이 기능이없는 것 같습니다.

import numpy as np 
a1 = np.array([1,2,3,4]) 
a2 = np.array([5,6,7,8]) 
a3 = np.vstack([a1,a2],dtype=[('RowName1','double'),('RowName2','double')]) 

산출 :

TypeError: vstack() got an unexpected keyword argument 'dtype' 


어떤 제안?

답변

1

vstack은 구조화 된 배열에서는 작동하지 않지만 메모리에서 인접한 '표준'numpy 배열에서만 작동합니다.

import numpy as np 
a3 = np.empty(4, dtype=[('RowName1','double'),('RowName2','double')]) 
a3['RowName1'] = a1 
a3['RowName2'] = a2 
2

뭔가 가능한 옵션은 (recfunctions 꽤 숨겨진 이후) :

from numpy.lib import recfunctions 
a1 = np.array([1,2,3,4]).astype(('RowName1',float)) 
a2 = np.array([5,6,7,8]).astype(('RowName2',float)) 
recfunctions.merge_arrays((a1, a2)) 

가장 쉬운 방법은 빈 구조화 된 배열을 만든 다음 원하는 행이 그것을 채우기 위해입니다

메모리를 재 해석 한 방식으로 인해 병합 된 배열로 새 재 배열을 만드는 것이 좋으므로주의해야 할 몇 가지 문제가 있습니다.

당신은 논리 주위를 돌 수 있었다 :

import numpy  
a1 = np.array([1,2,3,4]) 
a2 = np.array([5,6,7,8]) 
# ok, not that beautiful. But if your arrays are the correct type to begin with 
# you can skip that astype call. Using `np.c_[]` since it happens to concatenate right. 
a3 = np.c_[v1,v2].astype(float).copy('C').view(dtype=[('RowName1',float),('RowName2',float)]) 
+0

나는 그것이 OP가 원하는 것처럼 작동하지 않는다고 생각합니다. 첫째, 정수 배열을 double (즉, 왜곡 된) 것으로 볼 것이고 원하는 인덱스가 열이 아니라 행을 기준으로하기 때문에 모양이 틀립니다. – tiago

+1

@tango, right :/...'vstack'이 시작하기에 정말로 옳은지 검사하지 않았고 올바른 유형으로 명시 적으로 캐스트하지 않으면 뷰가 좋지 않음을 확인했습니다. – seberg

+1

여전히 잘못된 결과를 제공합니다. 'a3 [ 'RowName1']'을 보면 2 차원 배열 인'array ([[1., 5.], [3., 7..]])'이 나온다. 나는 진실로 궁금한 답변을 비판하지 않으려 고합니다. 'a1'과'a2'가 같은 타입이고 올바른 방향으로 연결 되더라도 행마다 뷰를 얻을 수있는 것처럼 보이지 않습니다. 모양이 잘못되었습니다. – tiago

2

또한 pandas보고하는 것이 좋습니다. 팬더는 좋은 data frame 데이터 구조를 가지고 있습니다.

물론이 경우 프로젝트에 다른 종속성을 추가해야합니다. 다행히도 이미 numpy를 사용하고 있다면 Pandas는 쉽게 얻을 수 있습니다.