Вычисление средних значений записей из нескольких файлов с помощью Python - PullRequest
1 голос
/ 12 ноября 2010

Дорогие все,
Я новичок в Python.Я ищу лучший способ сделать следующее в Python: предположим, у меня есть три текстовых файла, каждый из которых содержит m строк и n столбцов чисел, имя файла A, B и C. Для следующего содержимое может бытьиндексируется как A[i][j] или B[k][l] и так далее.Мне нужно вычислить среднее значение A[0][0], B[0][0], C[0][0] и записать его в файл D со значением D[0][0].И то же самое для остальных записей.Например, предположим, что:

A:  
1 2 3   
4 5 6  
B:  
0 1 3  
2 4 5  
C:  
2 5 6  
1 1 1

Следовательно, файл D должен быть

D:  
1     2.67   4    
2.33  3.33   4  

Мои фактические файлы, конечно, больше, чем существующие, порядка нескольких Мб.Я не уверен в лучшем решении, если читать все содержимое файла во вложенной структуре, проиндексированной по имени файла, или пытаться прочитать для каждого файла каждую строку и вычислить среднее значение.После прочтения руководства модуль fileinput в этом случае бесполезен, потому что он не читает строки «параллельно», как мне нужно здесь, но читает строки «последовательно».Любое руководство или совет высоко ценится.

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

Взгляните на numpy .Он может читать три файла в три массива (используя из файла ), вычислять среднее значение и экспортировать его в текстовый файл (используя tofile ).

import numpy as np


a = np.fromfile('A.csv', dtype=np.int)   
b = np.fromfile('B.csv', dtype=np.int)   
c = np.fromfile('C.csv', dtype=np.int)   

d = (a + b + c) / 3.0

d.tofile('D.csv')

Размер "несколько МБ" не должен быть проблемой.

0 голосов
/ 12 ноября 2010

Просто для справки, вот как вы могли бы сделать то же самое без глупых (менее изящных, но более гибких):

files = zip(open("A.dat"), open("B.dat"), open("C.dat"))
outfile = open("D.dat","w")
for rowgrp in files:     # e.g.("1 2 3\n", "0 1 3\n", "2 5 6\n")
    intsbyfile = [[int(a) for a in row.strip().split()] for row in rowgrp]
                         # [[1,2,3], [0,1,3], [2,5,6]]
    intgrps = zip(*intsbyfile) # [(1,0,2), (2,1,5), (3,3,6)]
    # use float() to ensure we get true division in Python 2.
    averages = [float(sum(intgrp))/len(intgrp) for intgrp in intgrps]
    outfile.write(" ".join(str(a) for a in averages) + "\n")

В Python 3 zip будет читать файлы только по мере необходимости. В Python 2, если они слишком велики для загрузки в память, используйте вместо этого itertools.izip.

0 голосов
/ 12 ноября 2010

В случае текстовых файлов попробуйте это:

def readdat(data,sep=','):
    step1 = data.split('\n')
    step2 = []
    for index in step1:
        step2.append(float(index.split(sep)))
    return step2

def formatdat(data,sep=','):
    step1 = []
    for index in data:
        step1.append(sep.join(str(data)))
    return '\n'.join(step1)

, а затем используйте эти функции для форматирования текста в списки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...