我有一个大的2D array
,我想sigma clipping
然后计算其中一个轴的中位数。
有没有办法一步到位?
正在进行sigma裁剪然后计算每列的中位数我能做到的唯一方法吗? sigma裁剪将改变数组的长度)。我的数组非常大,这似乎有点低效(我使用的典型数组将有shape = (29000, 2000)
)。
示例
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)
答案 0 :(得分:2)
我认为您正在使用this scipy function? sigmaclip
函数本身是迭代的,但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)