2

我有一个分组的 astropy 表,并且想遍历这些组并分别对每个组执行裁剪平均值。

下面的 MWE 说明了我正在尝试做的事情。当代码运行时,它不会抛出错误,而是列“c”的值保持为 0.0。我觉得我可能从根本上误解了表格环境的工作原理,但不确定到底是什么。

import numpy as np
from astropy.table import Table
from astropy.stats import sigma_clip

a = np.array([5.7, 5.9, 5.1, 5.3, 5.7, 5.4, 6.0, 8.6, 6.4, 5.2])
b = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
c = np.zeros(len(a))

tab = Table( (a,b,c), names=('a','b','c'), masked=True )

tabGrp = tab.group_by('b')

for x in tabGrp.groups:
    clipped = sigma_clip( x['a'], sigma=2)
    x['c'] = clipped
4

1 回答 1

0

当您对表进行分组时,会添加tab一个新groups属性。

您可以sigma_clip()在每个tabGrp组上应用,仅将值存储在列表中,使用此存储的值创建一个新的MaskedColumn(正确屏蔽值),并用c新的裁剪列替换旧列。

它不是很优雅,但似乎可以满足您的需要。

import numpy as np
from astropy.table import Table
from astropy.stats import sigma_clip
from astropy.table import MaskedColumn

a = np.array([5.7, 4.2, 5.1, 5.3, 5.7, 5.4, 6.0, 8.6, 6.4, 5.2])
b = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
c = np.zeros(len(a))

tab = Table((a, b, c), names=('a', 'b', 'c'), masked=True)

tabGrp = tab.group_by('b')
clipped = sigma_clip(tabGrp['a'], sigma=2)

col = []
for x in tabGrp.groups:
    clipped = sigma_clip(x['a'], sigma=2)
    # Save values only.
    col += clipped.tolist()

# Create new masked column.
c_clipped = MaskedColumn(col, mask=[True if _ is None else False for _ in col])
# Replace old c column
tab['c'] = c_clipped

结果是:

 a   b   c 
--- --- ---
5.7   0 5.7
4.2   0 4.2
5.1   0 5.1
5.3   0 5.3
5.7   1 5.7
5.4   1 5.4
6.0   1 6.0
8.6   1  --
6.4   1 6.4
5.2   1 5.2

这就是你所追求的吗?

于 2017-06-16T01:46:46.870 回答