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)