【问题标题】:Count number of points in 2D bins计算二维箱中的点数
【发布时间】:2017-09-11 16:09:07
【问题描述】:

我有一个文件,其中包含两列,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
.       .    .
.       .    .

我想将数据范围和binsize 传递给AWK 程序。

非常感谢您的帮助。

编辑:

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

【问题讨论】:

  • 您没有将输入样本发布为预期结果,为什么?
  • @RomanPerekhrest 抱歉,我已编辑帖子以添加示例。谢谢。
  • 这里的binsize有什么意义,它对你的结果有什么影响..?
  • @KaushikNayak 如果我将 binsize 减少 2,例如减少到 2.5,我们将结果文件中的行数加倍,并且第三列将具有较低的值,因为我们计算的点数较少垃圾箱。
  • 不清楚。您能否发布更多关于不同 binsize 的示例以及我可以与源文件中的数据点相关的预期输出?还有为什么 awk 程序需要 binsize 作为参数。范围不够吗?

标签: unix awk


【解决方案1】:

我认为解决方案可能如下所示:

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

【讨论】:

  • 您的解决方案是完美的,是我正在寻找的结果。抱歉,如果我对问题的解释令人困惑。非常感谢。
  • Gnuplot 需要这种类型的矩阵来绘制强度或热图。如果只想从分散的数据集中进行绘图,则会缺少这个部分。 R 或 Python 已经可以做到,但 Gnuplot 需要通过外部程序完成此计算。 AWK 是完美的。问候。
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 2020-02-05
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 2021-02-14
  • 2018-05-20
相关资源
最近更新 更多