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/etc. シンプルさのように、ソリューションが優先されます。

4

3 に答える 3

7

1ライナーではありませんが、非常に単純です(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

編集

1行のシェルコマンドとして、これは次のようになります

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