2011-04-18 2 views
1

genfromtxt을 사용하여 파일을 입력했는데 일부 값이 누락되어 마스크 된 배열을 생성합니다. 가면 배열의 레코드 값 중 일부를 색인하려고 할 때 알아 내지 못하는 오류가 발생합니다. 어떤 도움을 주시면 감사하겠습니다. 감사. --Alex마스크 된 배열 numpy 오류

import csv 
import datetime 
import time 
import numpy as np 
import numpy.lib.recfunctions as rf 
import pprint 
import numpy.ma as ma 

date_converter = lambda x: datetime.date(int(x[-4:]), int(x[3:5]), int(x[:2])) 
input_file = np.genfromtxt("../data/test.csv", usemask=True, converters={0:date_converter}, dtype="O4, i8, i8, i8, i8", names="date, firm, val1, val2, val3", delimiter=",", skip_header=1) 

는 생성 :

masked_array(data = [(datetime.date(2001, 3, 1), 1L, --, 14L, 15L) 
(datetime.date(2001, 2, 1), 1L, 10L, 11L, 12L) 
(datetime.date(2001, 5, 1), 1L, 19L, 20L, 21L) 
(datetime.date(2001, 4, 1), 1L, 16L, --, 18L)], 
      mask = [(False, False, True, False, False) (False, False, False, False, False) 
(False, False, False, False, False) (False, False, False, True, False)], 
     fill_value = ('?', 999999L, 999999L, 999999L, 999999L), 
      dtype = [('date', '|O4'), ('firm', '<i8'), ('val1', '<i8'), ('val2', '<i8'), ('val3', '<i8')]) 

나는 input_file[0]를 실행하면 내가받을 다음과 같은 오류 : INPUT_FILE

Traceback (most recent call last): 
    File "<pyshell#278>", line 1, in <module> 
    input_file[0] 
    File "C:\Python27\lib\site-packages\numpy\ma\core.py", line 2956, in __getitem__ 
    dout = mvoid(dout, mask=mask) 
    File "C:\Python27\lib\site-packages\numpy\ma\core.py", line 5529, in __new__ 
    _data[()] = data 
ValueError: Setting void-array with object members using buffer. 
+0

'input_file'을 사용하여 다른 작업을 수행 했습니까? 방금 input_file의 결과물을 복사하여 마스크 배열 (ma.MaskedArray (..))에 넣었으므로 첫 번째 행을'input_file [0]'으로 추출하는 데 아무런 문제가 없었습니다. – joris

+0

nope , 다른 아무것도하지 않았다. 내가 그것을 한 방식으로 그것을 할 시도해 주시겠습니까? 그냥 텍스트 파일에 그 데이터 항목을 던져, genfromtxt' 사용하여 그들을 읽으십시오? 내가 만들 수 있기 때문에 내가 생각할 수있는 유일한 것입니다. (비록 다른 데이터는 있지만) 데이터를 사용하여 마스크 된 배열을 접근 할 때 아무런 문제가 없다. – Alex

+0

'input_file [0]'으로 첫번째 행에 접근하는 데 아무런 문제가 없었지만, 코드에서 제거한 유일한 것은 'skip_header', 내가 생각하기에 numpy의 구버전을 가지고 있기 때문에. – joris

답변

0

[0]의 데이터에 액세스 할 수있는 올바른 방법이 아니다 마스크 된 배열 (documentation 참조)

예 :

>>> import numpy as np 
>>> arr = np.ma.ones(3, dtype=[('c1', np.int),('c2', np.int)]) 
>>> arr.mask[0][1] = True 
>>> arr.data[0][0] = 2    
>>> np.ma.getdata(arr)[1][0] = 3  
>>> arr.data[2][0] = 4  
>>> print(arr) 
    [(2, --) (3, 1) (4, 1)]