获取2D网格中每个bin的中值

时间:2015-12-08 04:26:54

标签: python statistics

我有一个二维坐标数组,每个坐标对应一个值z(如z = f(x,y))。现在我想将整个二维坐标组划分为例如100个偶数箱。并计算每个bin中z的中值。然后使用scipy.interpolate.griddata函数创建插值z曲面。我怎么能在python中实现它?我在考虑使用np.histogram2d,但我认为它没有中值函数。我发现自己很难理解scipy.stats.binned_statistic是如何工作的。有谁可以帮助我吗。感谢。

2 个答案:

答案 0 :(得分:1)

你需要一些功能或一个功能,具体取决于你想要如何构建事物:

  1. 创建容器的函数应该接收你的数据,确定每个bin的大小,并返回一个数组或数组数组(在python中也称为列表)。

    很乐意为此提供帮助,但需要有关数据的更多信息。

  2. 获取垃圾箱的中位数: Numpy(scipy的一部分)具有中值函数 http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.median.html 基本上是一个叫做数组的中位数 “斌” 将会: $ numpy.median(bin)

  3. 注意:numpy.median确实接受多个数组,因此您可以同时获得部分或全部垃圾箱的中位数。 numpy.median(bin),它会返回每个bin的中位数数组

    <强>更新

    您的示例代码不是100%,所以这里是:

    import numpy as np
    # added some parenthesis as I wasn't sure of the math. also removed ;'s
    def bincalc(x, y): 
        return x*(1-x)*(np.sin(np.pi*x))/(1.5+np.sin(2*(np.pi*y)**2)**2)
    
    coo = np.random.rand(1000,2)
    tcoo = coo[0]
    a = []
    for i in tcoo:
        a.append(bincalc(coo[0],coo[1]))
    z_med = np.median(a)
    print(z_med)`
    

答案 1 :(得分:1)

使用numpy.histogram2d,您可以计算数据的数量并对其求和,从而使您可以计算平均值。

我会尝试这样的事情:

import numpy as np
coo=np.array([np.arange(1000),np.arange(1000)]).T #your array coordinates

def func(x, y): return x*(1-x)*np.sin(np.pi*x) / (1.5+np.sin(2*np.pi*y**2)**2)

z = func(coo[:,0], coo[:,1])

(n,ex,ey)=np.histogram2d(coo[:,0], coo[:,1],bins=100) # here we get counting
(tot,ex,ey)=np.histogram2d(coo[:,0], coo[:,1],bins=100,weights=z) # here we get total over z
average=tot/n
average=np.nan_to_num(average) #cure 0/0 
print(average)