2016-11-13 8 views
1

にZ値が私は例えばパイソン - ビニングのx、yは、2Dグリッド

x  y     z 
3.1 5.2     1.3  
4.2 2.3     9.3 
5.6 9.8     3.5 

などを意味するペアx,yに関連zポイントのリストを持っています。私は次のような意味でのビン私のデータを、したい 10000の周りz値の合計数は、比較的高いです:

1)私が作るように、細胞内にxy値を分割したいですx,yの2次元グリッド。x軸のセルがNxで、軸のセルがNyの場合、グリッドにはNx*Nyのセルがあります。たとえば、xの最初のビンは1から2まで、2番目のビンは2から3まで、続きます。

2)2次元グリッド内のこのセルのそれぞれについて、そのセルに入るポイント数を計算し、その合計をzの値にする必要があります。これにより、各セルに関連付けられた数値が得られます。

私はをscipy.statsから使用することを考えましたが、私の仕事を達成するためのオプションを設定する方法はわかりません。助言がありますか? binned_statistic以外のツールもよく受け入れられています。あなたは、このように、binned_statistic_2dためexpand_binnumbersパラメータを利用することにより、あなたが必要なものを得ることができ、私は理解と仮定

答えて

1

from scipy.stats import binned_statistic_2d 
import numpy as np 

x = [0.1, 0.1, 0.1, 0.6] 
y = [2.1, 2.6, 2.1, 2.1] 
z = [2.,3.,5.,7.] 
binx = [0.0, 0.5, 1.0] 
biny = [2.0, 2.5, 3.0] 

ret = binned_statistic_2d(x, y, None, 'count', bins=[binx,biny], \ 
    expand_binnumbers=True) 

print (ret.statistic) 

print (ret.binnumber) 

sums = np.zeros([-1+len(binx), -1+len(biny)]) 

for i in range(len(x)): 
    m = ret.binnumber [0][i] - 1 
    n = ret.binnumber [1][i] - 1 
    sums[m][n] += sums[m][n] + z[i] 

print (sums) 

これは単なる例の1つの拡張です。ここに出力があります。

[[ 2. 1.] 
[ 1. 0.]] 
[[1 1 1 2] 
[1 2 1 1]] 
[[ 9. 3.] 
[ 7. 0.]] 
1

、セルのエッジを確立セル端を反復し、抽出物に各セル内 z値をブールインデックスを使用し、リスト内の和を保つ、リストを変換し、それを再構築。残念ながら

import itertools 
import numpy as np 
x = np.array([0.1, 0.1, 0.1, 0.6, 1.2, 2.1]) 
y = np.array([2.1, 2.6, 2.1, 2.1, 3.4, 4.7]) 
z = np.array([2., 3., 5., 7., 10, 20]) 


def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = itertools.tee(iterable) 
    next(b, None) 
    return itertools.izip(a, b) 

minx, maxx = int(min(x)), int(max(x)) + 1 
miny, maxy = int(min(y)), int(max(y)) + 1 

result = [] 
x_edges = pairwise(xrange(minx, maxx + 1)) 
for xleft, xright in x_edges: 
    xmask = np.logical_and(x >= xleft, x < xright) 
    y_edges = pairwise(xrange(miny, maxy + 1)) 
    for yleft, yright in y_edges: 
     ymask = np.logical_and(y >= yleft, y < yright) 
     cell = z[np.logical_and(xmask, ymask)] 
     result.append(cell.sum()) 

result = np.array(result).reshape((maxx - minx, maxy - miny)) 


>>> result 
array([[ 17., 0., 0.], 
     [ 0., 10., 0.], 
     [ 0., 0., 20.]]) 
>>> 

、無numpyのベクトル化魔法

関連する問題