<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/usr/bin/python
# avg.py
# Program to calculate the average and standard deviations
# of columns and lines in a rectangle of numbers

print "\n avg.py Written by Enno Middelberg 2002\n"
print " Calculates the average and standard errors of"
print " columns and lines in a rectangle of numbers\n"
print " avg.py [-cols] [-lines]\n"
print " sx     = sqrt( 1/(n-1) * sum ( x_i - x )^2 )"
print " sigmax = sqrt(  1/n  * sum ( x_i - x )^2 )\n"

import math
import string
import sys

# Function to work out avg, sx and sigmax from a list of numbers
def stat(numbers):
    sum=0
    # Calculate avg, sx and sigmax
    if len(numbers)&gt;1:
	for i in numbers:
	    sum=sum+i
	    # Store total sum for later
	    total=sum
	avg=sum/len(numbers)
	sum=0
	for i in numbers:
	    sum=sum+(i-avg)**2
	sx=math.sqrt(sum/(len(numbers)-1))
	sigmax=math.sqrt(sum/len(numbers))
    else:
	avg=numbers[0]
	sx=0
	sigmax=0
	sum=numbers[0]
    # Calculate mean
    numbers.sort()
    if (len(numbers) % 2)==1:
	mean=numbers[(len(numbers)-1)/2]
    else:
	mean=(numbers[(len(numbers)/2)-1]+numbers[(len(numbers)/2)])/2
    # Return results
    return avg, sx, sigmax, total, mean

# Get numbers from stdin
list=[]
for line in sys.stdin.readlines():
    if line[0]!="#":
	list.append(string.split(line))

ncols=len(list[0])
nlines=len(list)

print "\nNumber of columns: %i, number of lines: %i" % (ncols, nlines)

# Sort columns into 1D-lists and pass them to stat()
if "-cols" in sys.argv:
    colstats=[]
    for i in range(ncols):
	colnumbers=[]
	for j in range(nlines):
	    try:
		colnumbers.append(float(list[j][i]))
	    except (ValueError):
		continue
	colstats.append(stat(colnumbers))

print "\n",

# Sort lines into 1D-lists and pass them to stat()
if "-lines" in sys.argv:
    linestats=[]
    for i in range(nlines):
	linenumbers=[]
	for j in range(ncols):
	    try:
		linenumbers.append(float(list[i][j]))
	    except (ValueError):
		continue
	linestats.append(stat(linenumbers))

# Print results
print "            ",
for i in range(ncols):
    print "%i          " %i,
print
for i in range(nlines):
    print "%i -     " %i,
    for j in range(ncols):
	try:
	    print "% 5.4e" %(float(list[i][j])),
	except (ValueError):
	    print "           ",
    print

if "-cols" in sys.argv:
    print "\nColumn statistics:"
    print "\nAvg:    ",
    for i in colstats:
	print "% 5.4e" %i[0],
    print "\nsx:     ",
    for i in colstats:
	print "% 5.4e" %i[1],
    print "\nsigmax: ",
    for i in colstats:
	print "% 5.4e" %i[2],
    print "\nSum:    ",
    for i in colstats:
	print "% 5.4e" %i[3],
    print "\nMean:   ",
    for i in colstats:
	print "% 5.4e" %i[4],


if "-lines" in sys.argv:
    print "\n\nLine statistics:    Avg         sx          sigmax      Sum         Mean\n"
    for i in range(nlines):
	print "        Line  %i - % 5.4e % 5.4e % 5.4e % 5.4e % 5.4e" % (i,linestats[i][0], linestats[i][1], linestats[i][2], linestats[i][3], linestats[i][4])


</pre></body></html>