2014-11-11 5 views
0

numpy 재 배열에 파일 데이터를로드하고이어서 알려진 간격을 NaN으로 채 웁니다. 그러나 채우기 간격으로 배열을 다시 할당하기 위해 재 배열에서 필드 크기를 늘리는 방법을 찾을 수 없습니다. 내 문제의 예 (아래에 주어진다)는 더 큰 형태에서 더 작은 형태로 방송에 관한 가치 오류를 던진다. 파이썬 2.7.6.1을 사용확장 된 재 배열 필드 재 지정

, NumPy와 1.8.1-6

감사합니다, 롭

import numpy as np 
import numpy.ma as ma 

a1 = np.arange(0,20,1) 
a2 = np.arange(100,120,1) 

X = np.recarray((20,), dtype=[('g', float), ('h', int)]) 
X['g'][:] = a1 
X['h'][:] = a2 

for afield in X.dtype.names: 
    Y = X[afield].copy(order='K') 
    for icnt in range(0,3): 
     Y = np.insert(Y, 5, np.nan, axis=0) 

    ma.resize(X[afield], (len(Y),)) 
    X[afield][:] = Y[:] 
+0

첫 번째 열은 float 배열이지만 float NaN은 정수로 변환 할 수 없습니다. – Dalek

답변

1

당신은 당신의 recarray X. Recarrays 레이블에 따라 확장 할 수 없습니다 "확장"하지 않았다 (이름/칼럼), 당신이하고자하는 것은 ma.resize입니다. ma.resize은 전달 된 배열을 변경하지 않고 새 모양의 새 (마스크 된) 배열을 반환하지만 코드에서는 반환 값을 사용하지 않습니다. 그 선은 아무 것도하지 않습니다. 명확하게하려면 : 레이블 배열 ('열')별로 레코드 배열을 확장 할 수 없기 때문에

X[afield] = ma.resize(X[afield], (len(Y),)) 

도 작동하지 않습니다. 재 배열을 확장하려면 한 번에 수행해야하므로 (기능은 np.lib.recfunctions) 완전히 새로운 열을 추가하거나 모든 기존 열에 대해 여러 개의 새 레코드를 추가하십시오. 말했다되고 그건

, 왜 그냥 시도하지 : np.nan 부동 소수점 형이기 때문에 당신이 int로 2 열 (라벨 'H')을 변환 할 수 없습니다

>>> Y = np.arange(20, dtype=np.float) 
>>> Ynan = np.insert(Y, (5,)*3, (np.nan,)*3) 
>>> X = np.rec.fromarrays([Ynan, Ynan+100], names='g,h') 
>>> X 
rec.array([(0.0, 100.0), (1.0, 101.0), (2.0, 102.0), (3.0, 103.0), 
     (4.0, 104.0), (nan, nan), (nan, nan), (nan, nan), (5.0, 105.0), 
     (6.0, 106.0), (7.0, 107.0), (8.0, 108.0), (9.0, 109.0), 
     (10.0, 110.0), (11.0, 111.0), (12.0, 112.0), (13.0, 113.0), 
     (14.0, 114.0), (15.0, 115.0), (16.0, 116.0), (17.0, 117.0), 
     (18.0, 118.0), (19.0, 119.0)], 
     dtype=[('g', '<f8'), ('h', '<f8')]) 

참고.

>>> X['h'].astype(np.int) 
array([     100,     101,     102, 
         103,     104, -9223372036854775808, 
     -9223372036854775808, -9223372036854775808,     105, 
         106,     107,     108, 
         109,     110,     111, 
         112,     113,     114, 
         115,     116,     117, 
         118,     119]) 

나는 당신이 실제로 마스크 기록 배열 후 무슨 생각을 : 당신이 시도하는 경우, 당신은 쓰레기를 얻을 것

>>> import numpy.ma.mrecords as mrecords 
>>> 
>>> X = np.rec.fromarrays([Ynan, (Ynan+100).astype(np.int)], names='g,h') 
>>> Z = np.ma.array(X, mask=np.isnan(Ynan)) 
>>> Z2 = Z.view(mrecords.mrecarray) 
>>> 
>>> Z2 
masked_records(
    g : [0.0 1.0 2.0 3.0 4.0 -- -- -- 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 
15.0 16.0 17.0 18.0 19.0] 
    h : [100 101 102 103 104 -- -- -- 105 106 107 108 109 110 111 112 113 114 115 
116 117 118 119] 
    fill_value : (1e+20, 999999) 
      ) 
>>> 
>>> Z2['h'] 
masked_array(data = [100 101 102 103 104 -- -- -- 105 106 107 108 109 110 111 112 113 114 115 
116 117 118 119], 
      mask = [False False False False False True True True False False False False 
False False False False False False False False False False False], 
     fill_value = 999999) 

당신은 Z2의에서 "열"을 볼 수 있듯이 원하는 dtype (float 및 int)을 가지며 열 이름으로 액세스 할 수 있고 일부 데이터가 가려져 있습니다.