计算2D箱中的点数

时间:2017-09-11 16:09:07

标签: unix awk

我有一个包含两列的文件,X和Y为正数,非网格数据点(> 10 ^ 5点)。

1     0.9
0.9   1.1
0.5   1.25
2.6   0.9
3.1   2.6
2.9   2.55
4.1   0.9
1.2   6
5.5   2.5
6     4
4     7.2
.     .
.     .

我想在这些点的选定范围内生成X-Y网格(大小为binsize)。此外,我想添加第三列,指示网格中每个顶点的正方形区域(binsize x binsize)中包含的原始数据点的计数。

如果binsize=5

2.5    2.5   7 
2.5    7.5   2
7.5    2.5   2
.       .    .
.       .    .

我想向AWK程序传递数据范围和binsize

非常感谢你的帮助。

修改

binsize用于确定我必须计算XY数据点的值的范围。范围输入是选择要计数的x和y值,例如,如果我在[0,5]中选择x而在[0,5]中选择y,那么我将仅考虑前八个xy点的分箱。我的真实数据集很大

1 个答案:

答案 0 :(得分:2)

我认为解决方案看起来像这样:

awk -v binsize=0.5 -v xmin=0 -v xmax=3 -v ymin=2 -v ymax=4 '
BEGIN {
   # Calculate number of x-bins and number of y-bins
   nx=int((xmax-xmin)/binsize)
   ny=int((ymax-ymin)/binsize)
   # Pre-zero all bins else empty entries will not show up in output
   for(x=0;x<nx;x++){
      for(y=0;y<ny;y++){
         output[x,y]=0
      }
   }
}

{
   # pick up x and y
   x=$1; y=$2

   # if this sample within x-range and y-range
   if(x>=xmin && x<=xmax && y>=ymin && y<=ymax){
      xindex=int((x-xmin)/binsize)
      yindex=int((y-ymin)/binsize)
      output[xindex,yindex]++;
      printf("DEBUG: x=%f, y=%f (line %d)\n",x,y,NR);
      printf("DEBUG: Incrementing bin [%d][%d]\n",xindex,yindex);
   }
}

END{
   # Print results
   for(x=0;x<nx;x++){
      for(y=0;y<ny;y++){
         printf("%d\t",output[x,y]);
      }
      printf("\n");
   }
} ' points.txt

并将此作为输入:

0.4   2.1
0.39  2.02
0.1   2.4
1     0.9
0.9   1.1
0.5   1.25
2.6   0.9
3.1   2.6
2.9   2.55

你得到这个作为输出:

DEBUG: x=0.400000, y=2.100000 (line 1)
DEBUG: Incrementing bin [0][0]
DEBUG: x=0.390000, y=2.020000 (line 2)
DEBUG: Incrementing bin [0][0]
DEBUG: x=0.100000, y=2.400000 (line 3)
DEBUG: Incrementing bin [0][0]
DEBUG: x=2.900000, y=2.550000 (line 9)
DEBUG: Incrementing bin [5][1]
3   0   0   0   
0   0   0   0   
0   0   0   0   
0   0   0   0   
0   0   0   0   
0   1   0   0