Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文本字段创建屏蔽数组_Python_Numpy_Scipy - Fatal编程技术网

Python 从文本字段创建屏蔽数组

Python 从文本字段创建屏蔽数组,python,numpy,scipy,Python,Numpy,Scipy,显示了使用ma.masked后验值(创建数组后)屏蔽现有值的示例,或从看似有效的数据类型列表(如果dtype=int,则为整数)创建屏蔽数组的示例。我试图从一个文件中读取数据(需要一些文本操作),但在某个时候,我会有一个列表(或元组),其中包含字符串,我想从中创建一个数字(浮点)数组 数据的示例可能是textdata='1\t2\t3\n4\t\t6'(清理后的典型平面文本格式) 我遇到的一个问题是,缺少的值可能被编码为“”,当尝试使用dtype参数转换为float时,这将告诉我 ValueEr

显示了使用
ma.masked
后验值(创建数组后)屏蔽现有值的示例,或从看似有效的数据类型列表(如果
dtype=int
,则为整数)创建屏蔽数组的示例。我试图从一个文件中读取数据(需要一些文本操作),但在某个时候,我会有一个列表(或元组),其中包含字符串,我想从中创建一个数字(浮点)数组

数据的示例可能是
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)

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

这样做很好。(尽管您可以通过避免构建临时的“
三元组”
”dict,让它更具可读性,只是为了在以后扩展它,i.m.o.)

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

这将产生:

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(分隔符)
)。如果可以的话,您最好使用类似于
“xxx”
的东西作为缺少值的标记。

谢谢-考虑过genfromtxt,但首先需要太多的预处理,但是感谢您提供关于行开头缺少值的提示!还有StringIO把戏。。。
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)