将蒙版天体表中的元素转换为np.nan

时间:2018-05-03 17:53:32

标签: python astropy

考虑使用一些无效条目读取数据文件的简单过程。这是我的test.dat文件:

16        1035.22  1041.09    24.54     0.30     1.39     0.30     1.80     0.30     2.26     0.30     1.14     0.30     0.28     0.30   0.2884
127        824.57  1105.52    25.02     0.29     0.87     0.29     1.30     0.29     2.12     0.29     0.66     0.29     0.10     0.29   0.2986
182       1015.83   904.93    INDEF     0.28     1.80     0.28     1.64     0.28     2.38     0.28     1.04     0.28     0.06     0.28   0.3271
185       1019.15  1155.09    24.31     0.28     1.40     0.28     1.78     0.28     2.10     0.28     0.87     0.28     0.35     0.28   0.3290
192       1024.80  1045.57    24.27     0.27     1.24     0.27     2.01     0.27     2.40     0.27     0.90     0.27     0.09     0.27   0.3328
197       1035.99   876.04    24.10     0.27     1.23     0.27     1.52     0.27     2.59     0.27     0.45     0.27     0.25     0.27   0.3357
198       1110.80  1087.97    24.53     0.27     1.49     0.27     1.71     0.27     2.33     0.27     0.22     0.27     0.00     0.27   0.3362
1103      1168.39  1065.97    24.35     0.27     1.28     0.27     1.29     0.27     2.68     0.27     0.43     0.27     0.26     0.27   0.3388

这是读取它的代码,并用浮点数(INDEF)替换“坏”值(99.999

import numpy as np
from astropy.io import ascii

data = ascii.read("test.dat", fill_values=[('INDEF', '0')])
data = data.filled(99.999)

这很好用,但是如果我尝试用np.nan替换坏值(即我使用行data = data.filled(np.nan)),我得到:

ValueError: cannot convert float NaN to integer

为什么会这样,我该如何解决它?

4 个答案:

答案 0 :(得分:3)

如前所述,问题是numpy MaskedArray.filled()方法似乎尝试将填充值转换为适当的类型,然后再检查是否有任何要填充的内容。由于示例中的表具有int列,因此在numpy中失败(并且astropy.Table只是在每列上调用filled()方法)。

这应该有效:

In [44]: def fill_cols(tbl, fill=np.nan, kind='f'):
    ...:     """
    ...:     In-place fill of ``tbl`` columns which have dtype ``kind``
    ...:     with ``fill`` value.
    ...:     """
    ...:     for col in tbl.itercols():
    ...:         if col.dtype.kind == kind:
    ...:             col[...] = col.filled(fill)
    ...: 

In [45]: t = simple_table(masked=True)

In [46]: t
Out[46]: 
<Table masked=True length=3>
  a      b     c  
int64 float64 str1
----- ------- ----
   --     1.0    c
    2     2.0   --
    3      --    e

In [47]: fill_cols(t)

In [48]: t
Out[48]: 
<Table masked=True length=3>
  a      b     c  
int64 float64 str1
----- ------- ----
   --     1.0    c
    2     2.0   --
    3     nan    e

答案 1 :(得分:0)

在numpy.ma.filled中,这种情况发生在numpy中。基本上,填充值必须是标量。

一个混乱的解决方案,填充nan并仍然返回一个表可能看起来像:

mat

答案 2 :(得分:0)

我不认为这主要是个问题,因为它适用于各个列:

>>> data['col4'].filled(np.nan)
<Column name='col4' dtype='float64' length=8>
24.54
25.02
  nan
24.31
24.27
24.1
24.53
24.35

但您仍然无法从此构建Table -

Table([data[n].filled(np.nan) for n in data.colnames])

np.ma.core中引发了同样的错误。 您可以明确设置

data['col4'] = data['col4'].filled(np.nan)

但这显然让桌子失去了.filled()方法...... 我对掩码数组和表并不熟悉,但是你已经在Github上提交了related issue,你可能想要添加这个问题。

答案 3 :(得分:-1)

切出中间人? fill_values=[('INDEF', np.nan)])似乎有效。