代码之家  ›  专栏  ›  技术社区  ›  hatmatrix

从文本字段创建屏蔽数组

  •  2
  • hatmatrix  · 技术社区  · 16 年前

    numpy documentation 显示了使用隐藏现有值的示例 ma.masked 一个后验概率(在数组创建之后),或者从一个看似有效的数据类型列表(如果是整数)中创建一个屏蔽数组 dtype=int ). 我试图从一个文件中读入数据(并且需要一些文本操作),但是在某个时候,我会有一个包含字符串的列表(或元组),我想从中生成一个数字(float)数组。

    数据的一个例子可能是 textdata='1\t2\t3\n4\t\t6' (清洗后的典型文本格式)。

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

    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)
    

    这似乎起到了作用:

    >>> makemaskedarray([('1','2','3'),('4','','6')])
    masked_array(data =
     [[1.0 2.0 3.0]
     [4.0 -- 6.0]],
                 mask =
     [[False False False]
     [False  True False]],
           fill_value = 1e+20)
    

    是这样做的吗?还是有内置功能?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Joe Kington    16 年前

    你这样做很好。(不过,通过避免构建临时 triple “迪克特,等一下再说一遍,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" 作为缺失值的标记,如果可以的话。