2011-04-18 94 views
1

我使用genfromtxt输入文件,其中一些值丢失,所以我生成一个被屏蔽的数组。当我尝试索引掩码数组的记录的某些值时,我得到一个我找不到的错误。任何帮助将不胜感激。谢谢。 --Alexnumpy错误中的被掩码数组

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]我得到以下错误:

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 2011-04-20 07:45:13

+0

nope ,没有别的,你可以按照我这样做的方式来做这件事吗?也就是说,把这些数据项放在一个文本文件中,请用'genfromtxt'将它们读出来?这是我唯一能想到的,因为如果我创建一个从头开始使用数据的掩码数组(虽然数据不同),但访问它也没有问题 – Alex 2011-04-20 14:17:28

+0

我做过了,但用'input_file [0]'访问第一行也没问题,我从代码中移除的唯一东西是'skip_header',因为我有一个老版本的numpy我觉得 – joris 2011-04-21 07:49:40

回答

0

INPUT_FILE [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)]