我有一个二维坐标数组,每个坐标对应一个值z(如z = f(x,y))。现在我想将整个二维坐标组划分为例如100个偶数箱。并计算每个bin中z的中值。然后使用scipy.interpolate.griddata函数创建插值z曲面。我怎么能在python中实现它?我在考虑使用np.histogram2d,但我认为它没有中值函数。我发现自己很难理解scipy.stats.binned_statistic是如何工作的。有谁可以帮助我吗。感谢。
答案 0 :(得分:1)
你需要一些功能或一个功能,具体取决于你想要如何构建事物:
创建容器的函数应该接收你的数据,确定每个bin的大小,并返回一个数组或数组数组(在python中也称为列表)。
很乐意为此提供帮助,但需要有关数据的更多信息。
获取垃圾箱的中位数: Numpy(scipy的一部分)具有中值函数 http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.median.html 基本上是一个叫做数组的中位数 “斌” 将会: $ numpy.median(bin)
注意: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)