【发布时间】:2020-12-14 23:44:32
【问题描述】:
我正在使用 numpy genfromtxt,我需要识别丢失的数据和错误的数据。根据用户输入,我可能想要删除错误值或引发错误。本质上,我想将丢失的数据和错误的数据视为同一件事。
假设我有一个这样的文件,其中列的数据类型为“日期、整数、浮点数”
date,id,value
2017-12-4,0, # BAD. missing data
2017-12-4,1,XYZ # BAD. value should be float, not string.
2017-12-4,2,1.0 # good
2017-12-4,3,1.0 # good
2017-12-4,4,1.0 # good
我想同时检测两者。所以,我这样做了
dtype=(np.dtype('<M8[D]'), np.dtype('int64'), np.dtype('float64'))
result = np.genfromtxt(filename, delimiter=',', dtype=dtype, names=True, usemask=True, usecols=('date', 'id', 'value'))
结果是这样的
masked_array(data=[(datetime.date(2017, 12, 4), 0, --),
(datetime.date(2017, 12, 4), 1, nan),
(datetime.date(2017, 12, 4), 2, 1.0),
(datetime.date(2017, 12, 4), 3, 1.0),
(datetime.date(2017, 12, 4), 4, 1.0)],
mask=[(False, False, True), (False, False, False),
(False, False, False), (False, False, False),
(False, False, False)],
fill_value=('NaT', 999999, 1.e+20),
dtype=[('date', '<M8[D]'), ('id', '<i8'), ('value', '<f8')])
我认为 masked_array 的全部意义在于它可以处理丢失的数据和错误的数据。但在这里,它只处理丢失的数据。
result['value'].mask
返回
array([ True, False, False, False, False])
“坏”数据实际上仍以 nan 的形式进入数组。我希望面具能给我True True False False False。
为了让我意识到我们在第二行有一个错误的值,我需要做一些额外的工作,比如检查 nan。
another_mask = np.isnan(result['value'])
good_result = result['value'][~another_mask]
最后,返回
masked_array(data=[1.0, 1.0, 1.0],
mask=[False, False, False],
fill_value=1e+20)
这行得通,但我觉得我做错了什么。 maskedArray 的全部意义在于查找丢失和错误的数据,但我只是用它来查找丢失的数据。我需要自己检查才能找到不良数据。感觉丑陋而不像pythonic。
有没有办法同时找到两者?
【问题讨论】:
-
我不喜欢那种“非pythonic”的概念。如果它有效,它是pythonic。现在是否充分利用
genfromtxt这样的复杂功能是另一回事。我现在不能引用它,但不久前我在另一个 SO 中与它搏斗。该函数似乎擅长填充缺失值。蒙面部分是否功能齐全,甚至它应该做什么都不太清楚。它没有很好的记录 -
用
nan填充怎么样,然后用np.ma.masked_invalid屏蔽所有nan。在genfromtxt中做任何事情都不会获得任何布朗尼积分。 -
当您创建
MaskedArray时,您必须指定要屏蔽的内容。该类没有默认的屏蔽标准。genfrontxt没有记录它对该标志的使用。 -
填写
nan是我最后的选择。我不喜欢nan的原因是nan可能是一个实际数字。但是字符串和空格都是错误值的示例。我想区分nan和bad_values。这就是为什么我认为 masked_array 会是个好主意。
标签: numpy numpy-ndarray masked-array