2015-12-08 40 views
1

我有一個二維座標數組,每個座標對應一個z值(如z = f(x,y))。現在我想將整個二維座標集劃分爲例如100個甚至二進制文件。並計算每個bin中z的中值。然後使用scipy.interpolate.griddata函數創建一個插值z曲面。我如何在Python中實現它?我正在考慮使用np.histogram2d,但我認爲它沒有中值函數。我發現自己很難理解scipy.stats.binned_statistic是如何工作的。有人能幫助我嗎。謝謝。獲取二維網格中每個bin中的中值

回答

1

你需要的一些功能或一個取決於你想如何構建的東西:

  1. 函數來創建垃圾箱應該在你的數據,確定每個區間有多大,並返回一個數組或數組數組(在python中也稱爲列表)。

    樂於幫助,但需要更多關於數據的信息。

  2. 得到箱的中位數: numpy的(SciPy的部分)的中值函數 http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.median.html 基本上是一個陣列上的位數叫 「bin」 的 將是: $ numpy.median(BIN)

注意:numpy.median確實接受多個數組,因此您可以一次性獲得部分或全部垃圾箱的中位數。 numpy.median(箱),這將返回值的數組,每個箱

你的示例代碼更新

不是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)` 
+0

例如:高清FUNC(X,Y): 返回X *(1-X)* np.sin(np.pi * X)/( 1.5 + np.sin(2 * np.pi * Y ** 2)** 2); coo = np.random.rand(1000,2); z = func(coo [:,0],coo [:,1]); – frankgut

+0

更新回答以上 –

+0

爲什麼它只給我一個z_med的值,而不是一個數組? – frankgut

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) 
+0

謝謝,但這是爲了獲得平均水平。我想獲得中位數。 – frankgut