在Python中使用sigma剪辑的2d数组的中位数

时间:2015-07-09 07:16:25

标签: python numpy statistics scipy

我有一个大的2D array,我想sigma clipping然后计算其中一个轴的中位数。

  1. 有没有办法一步到位?

  2. 正在进行sigma裁剪然后计算每列的中位数我能做到的唯一方法吗? sigma裁剪将改变数组的长度)。我的数组非常大,这似乎有点低效(我使用的典型数组将有shape = (29000, 2000))。

  3. 示例

    x= random.random(9000).reshape(1000, 9)
    v= []
    for i in range(x.shape[0]):
        y= sigmaclip(x[i], 1.5, 1.5)
        m= median(y[0])
        v.append(m)
    

1 个答案:

答案 0 :(得分:2)

我认为您正在使用this scipy functionsigmaclip函数本身是迭代的,但for循环可能会使你最慢减速(特别是当你沿着最长轴迭代时)。您可以使用数组操作来加快速度(尽管可能并不简单),可能是这样的:

top     = 1.5
bot     = 1.5
xm      = ma.masked_array(x)

while 1:
    mn  = ma.mean(xm, axis=1)
    sig = ma.std(xm, axis=1)
    mask= (((xm.T <= (mn - bot*sig)) | (xm.T >= (mn + top*sig)))).T

    if (mask == xm.mask).all():
        break
    xm.mask     = mask

med     = ma.median(xm, axis = 1)