首页 > 解决方案 > 具有非均匀数组的 Bin 平均值

问题描述

我有一组不均匀的速度剖面(速度与高度),我需要对所有剖面进行平均(bin 1 km)。这是三个“合成”配置文件的示例:

testalt1 = np.arange(70,75,1)
testalt2 = np.arange(72,80,1)
testalt3 = np.arange(60,69,1)

vtest1 = np.arange(-2,3,1)
vtest2 = np.arange(-3,5,1)
vtest3 = np.arange(-3,6,1)

print testalt1,testalt2, testalt3
print vtest1,vtest2, vtest3

输出:

[70 71 72 73 74] [72 73 74 75 76 77 78 79] [60 61 62 63 64 65 66 67 68]
[-2 -1  0  1  2] [-3 -2 -1  0  1  2  3  4] [-3 -2 -1  0  1  2  3  4  5]

所以我的代码的最终结果应该是一个配置文件,只要有重叠,它就会取平均值,并且只取它存在的一个数组的值。例如:

结果altmean应该是:

[60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79]

从海拔 60 公里到 68 公里,输出vmean应为:

[-3 -2 -1 0 1 2 3 4 5]

对于海拔 69,我们应该有一个NaN. 那么altmean = [70 71]应该有vmean = [-2 -1],对应的值vtest1。只要在 72 到 74 公里之间的范围内有重叠,就会开始平均,这应该输出:

altmean = [72 73 74] vmean = [-1.5 -0.5 0.5]

最终输出应该是:

altmean = [60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79] vmean = [-3 -2 -1 0 1 2 3 4 5 NaN -2 -1 -1.5 -0.5 0.5 0 1 2 3 4]

该解决方案应扩展到 50 个配置文件。

非常感谢你们

标签: python-2.7binning

解决方案


该问题的解决方案如下(u 只是具有不同风分量的数组):

def averagingarrays(alt1,v1,u1,alt2,v2,u2):

    altmin = np.min([np.min(alt1),np.min(alt2)])
    altmax = np.max([np.max(alt1),np.max(alt2)])

    altarray = np.arange(altmin,altmax+1,1)
    vmean = np.zeros(np.size(altarray))
    umean = np.zeros(np.size(altarray))
    vc = 0
    for alt in altarray:
        altw1 = np.where(alt1 == alt)[0]
        altw2 = np.where(alt2 == alt)[0]

        if np.size(altw1) != 0 and np.size(altw2) != 0:
            vmean[vc] = np.nanmean([v1[altw1], v2[altw2]])
            umean[vc] = np.nanmean([u1[altw1], u2[altw2]])
        if np.size(altw1) != 0 and np.size(altw2) == 0:
            vmean[vc] = v1[altw1]
            umean[vc] = u1[altw1]
        if np.size(altw2) != 0 and np.size(altw1) == 0:
            vmean[vc] = v2[altw2]
            umean[vc] = u2[altw2]
        if np.size(altw1) == 0 and np.size(altw2) == 0:
            vmean[vc] = np.NaN
            umean[vc] = np.NaN
            #print altw1, alt
        vc = vc+1

    return altarray,vmean,umean

aux = averagingarrays(testalt1,vtest1,utest1, testalt2,vtest2,utest2)

print averagingarrays(aux[0],aux[1],aux[2], testalt3,vtest3,utest3)

推荐阅读