0

我有一个包含几行的文件,每行包含大约 30,000 个整数。我有兴趣计算每行的各种统计量,例如平均值/媒体/方差/等。

例如,给定一个文件,其内容为

1 2 3 4 5
6 8 9 0 10 11 12

我想要一个类似于的输出

(std = 1.4142135623730951, mean = 3.0, median = 3.0)
(std = 3.7416573867739413, mean = 8.0, median = 9.0)    

除了自己写东西(通过数字获得幸福)之外,我还有什么选择?有没有针对此的单行代码?

一个 bash/python/perl/等。解决方案是首选,因为它很简单。

4

3 回答 3

7

不是一个 1-liner,但很简单(前提是你已经安装了 numpy)。

import numpy as np
with open(filename) as f:
    for line in f:
        a=np.array(line.split(),dtype=int)
        print(a.std(),a.mean(),np.median(a))  #standard-deviation, mean, median
于 2012-07-27T14:05:48.033 回答
3

如果您安装该Statistics::Basic模块,它在 Perl 中看起来像这样。大部分命令是格式字符串!

perl -MStatistics::Basic=:all -lane 'printf "(std = %.16f, mean = %.1f, median = %.1f)\n",stddev(@F),mean(@F),median(@F)' datafile

输出

(std = 1.4142135623730951, mean = 3.0, median = 3.0)
(std = 3.7416573867739413, mean = 8.0, median = 9.0)
于 2012-07-28T04:25:22.837 回答
2

我认为直接解决了您在 Perl 中的问题。我认为您能否将其归结为单线有点怀疑。

这是使用PDL的示例:

#!/usr/bin/env perl

use Modern::Perl;
use PDL;

open my $FILE, '<', './numbers.txt';

my @numbers = <$FILE>;

foreach my $number_set ( @numbers ) {
    my $piddle = pdl $number_set;
    my ($mean,$prms,$median,$min,$max,$adev,$rms) = statsover $piddle;
    printf "(std = %f, mean = %3.1f, median = %3.1f)\n", $rms, $mean, $median;
}

Numbers.txt 包含:

1 2 3 4 5
6 8 9 0 10 11 12

编辑

作为一个单行 shell 命令,这看起来像

perl -MPDL -lne 'printf "(std = %7\$.16f, mean = %1\$.1f, median = %3\$.1f)\n", statsover pdl $_' numbers.txt
于 2012-07-27T14:05:38.343 回答