从文本字段创建蒙版数组

时间:2010-09-11 19:45:08

标签: python numpy scipy

numpy documentation显示了使用ma.masked a posteriori(在数组创建之后)屏蔽现有值的示例,或者从似乎是有效数据类型的列表中创建屏蔽数组(整数if { {1}})。我试图从文件读取数据(并需要一些文本操作),但在某些时候,我将有一个包含字符串的列表(或元组)列表,我想从中创建一个数字(浮点)数组。

数据示例可能是dtype=int(清洁后的典型平面文字格式)。

我遇到的一个问题是缺少的值可能被编码为'',当尝试使用dtype参数转换为float时,会告诉我

textdata='1\t2\t3\n4\t\t6'

所以我创造了这个功能

ValueError: setting an array element with a sequence. 

似乎可以解决这个问题:

def makemaskedarray(X,missing='',fillvalue='-999.',dtype=float):
    arr = lambda x: x==missing and fillvalue or x    
    mask = lambda x: x==missing and 1 or 0
    triple = dict(zip(('data','mask','dtype'),
                      zip(*[(map(arr,x),map(mask,x)) for x in X])+
                      [dtype]))
    return ma.array(**triple)

这是这样做的吗?或者有一个内置功能?

1 个答案:

答案 0 :(得分:1)

你这样做的方式很好。 (虽然你可以通过避免构建临时的“triple”dict来使它更​​具可读性,但只需稍后再扩展它,i.m.o。)

内置方式是使用numpy.genfromtxt。根据您需要对文本文件执行的预处理量,它可能会也可能不会执行您需要的操作。但是,作为一个基本示例:(使用StringIO来模拟文件......)

from StringIO import StringIO
import numpy as np

txt_data = """
1\t2\t3
4\t\t6
7t\8t\9"""

infile = StringIO(txt_data)
data = np.genfromtxt(infile, usemask=True, delimiter='\t')

哪个收益率:

masked_array(data =
 [[1.0 2.0 3.0]
 [4.0 -- 6.0]
 [7.0 8.0 9.0]],
             mask =
 [[False False False]
 [False  True False]
 [False False False]],
       fill_value = 1e+20)

提醒一句:如果您确实使用制表符作为分隔符,并使用空字符串作为缺失值标记,则在行的开头会出现缺少值的问题。 (genfromtxt基本上会调用line.strip().split(delimiter))。如果可以的话,最好使用"xxx"之类的东西作为缺失值的标记。