gpt4 book ai didi

linux - 二维直方图制作

转载 作者:IT王子 更新时间:2023-10-29 01:24:38 27 4
gpt4 key购买 nike

我有一个包含两列的数据文件,例如

1.1 2.2
3.1 4.5
1.2 4.5
3.2 4.6
1.1 2.3
4.2 4.9
4.2 1.1

我想从两列制作直方图,即获得此输出(如果步长(或 bin 大小,正如我们谈论直方图)等于 0.1 在这种情况下)

1.0 1.0 0
1.0 1.1 0
1.0 1.2 0
...
1.1 1.0 0
1.1 1.1 0
1.1 1.2 0
...
1.1 2.0 0
1.1 2.1 0
1.1 2.2 1
...
...

有人可以给我一些建议吗?如果我可以设置 colmuns 的值范围,那就太好了。在上面的例子中,第一列的值从 1 到 4,与第二列相同。

已编辑: 已更新以处理更一般的数据输入,例如 float 。上述情况下的步长为 0.1,但如果它可以针对其他设置进行调整就更好了,即如果步长范围(bin 大小)例如为 0.2 或 1.0 。例如,如果步长为 1.0,那么如果我有 1.1 和 1.8,它们具有相同的 bin,我们必须一起处理它们,例如(在这种情况下,范围让我们为两列 0.0 .. . 4.0)

1.1 1.8
2.5 2.6
1.4 2.1
1.3 1.5
3.3 4.0
3.8 3.9
4.0 3.2
4.0 4.0

输出(如果 bin 大小 = 1.0)

1 1 2
1 2 1
1 3 0
1 4 0

2 1 0
2 2 1
2 3 0
2 4 0

3 1 0
3 2 0
3 3 1
3 4 1

4 1 0
4 2 0
4 3 1
4 4 1

最佳答案

awk 'END {
for (i = 0; ++i <= l;) {
for (j = 0; ++j <= l;)
printf "%d %d %d %s\n", i, j, \
b[i, j], (j < l ? x : ORS)
}
}
{
f[NR] = $1; s[NR] = $2
b[$1, $2]++
}' l=4 infile

你可以试试这个(没有经过彻底测试):

awk -v l=4 -v bs=0.1 'BEGIN {
if (!bs) {
print "invalid bin size" > "/dev/stderr"
exit
}
split(bs, t, ".")
t[2] || fl++
m = "%." length(t[2]) "f"
}
{
fk = fl ? int($1) : sprintf(m, $1)
sk = fl ? int($2) : sprintf(m, $2)
f[fk]; s[sk]; b[fk, sk]++
}

END {
if (!bs) exit 1

for (i = 1; int(i) <= l; i += bs) {
for (j = 1; int(j) <= l; j += bs) {
if (fl) {
fk = int(i); sk = int(j); m = "%d"
}
else {
fk = sprintf(m, i); sk = sprintf(m, j)
}
printf "%s" m OFS m OFS "%d\n", (i > 1 && fk != p ? ORS : x), fk, sk, b[fk, sk]
p = fk
}
}
}' infile

关于linux - 二维直方图制作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743142/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com