Получить средние строки, столбца матрицы из текстового файла

1

Мой вопрос - как получить каждую среднюю матрицу и записать ее в новый текстовый файл.

Если содержимое текста

1 -20 -100 50 60
3 4 -100 -3 
-10 5 45 10 -15\n

Я хочу получить такой результат без использования numpy:

1 -20 -100 50 60  avg : -2
3 4 -100 -3 0     avg : -20
-10 5 45 10 -15   avg : 7
-2 -4 -52 19 15

Вот мой код:

with open('number.txt','r') as file1:
    file2 = open('text2.txt','w')
    line = file1.readlines()
    for i in range(len(line)):
        a = str(line[i])
        a.split()
        b = a.split()
        for j in range(len(b)):
            sum(int(b[0][i]))/len(b)
        for z in range(len(b)):
            sum(int(b[i][0]))/len(b) 
Теги:
file
text
average

4 ответа

1

новый: ziperdyzip

Кажется, вы не хотите использовать NumPy по какой-то причине. Ну: это не использует numpy:

rowMean = [sum(row)//len(row) for row in data]
colmean = [sum(col)//len(col) for col in list(map(list, zip(*data)))]

Полный пример:

with open('number.txt', 'r') as file1:
    data = file1.readlines()
data = [line.split() for line in data]
data = [list(map(int, row)) for row in data]

outData = [list(map(str, row)) + ['avg :', str(sum(row)//len(row)), '\n'] for row in data]
outData.append([str(sum(col)//len(col)) for col in list(map(list, zip(*data)))])

with open('text2.txt', 'w') as file2:
    file2.writelines([' '.join(row) for row in outData])

Или в компактном виде с правой формой обоснования:

with open('output.txt', 'w') as outfile, open('number.txt', 'r') as infile:
    data = [list(map(int, line.split())) for line in infile.readlines()]
    outfile.writelines([' '.join([str(el).rjust(4) for el in row] + ['avg :', str(sum(row)//len(row)).rjust(4), '\n']) for row in data])
    outfile.write(' '.join([str(sum(col)//len(col)).rjust(4) for col in list(map(list, zip(*data)))]))

выход:

   1  -20 -100   50   60 avg :   -2 
   3    4 -100   -3    0 avg :  -20 
 -10    5   45   10  -15 avg :    7 
  -2   -4  -52   19   15

old: Numpy

Вы можете использовать NumPy

data = [[1, -20, -100, 50, 60],
        [3, 4, -100, -3, 0],
        [-10, 5, 45, 10, -15]]

import numpy as np

colMean = np.floor(np.mean(data,0)).astype(int).tolist()
rowMean = np.floor(np.mean(data,1)).astype(int).tolist()

Я использовал np.floor() поскольку из вашего примера кажется, что вы хотите округлить.

  • 0
    На самом деле, есть много способов решить эту проблему. Таким образом, нет единого лучшего ответа на такой вопрос.
0

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

import numpy as np

with open('number.txt','r') as file1:
    file2 = open('text2.txt','w')
    line = file1.readlines()
    for i in range(len(line)):
        #print(line )
        a = str(line[i]).replace('\n','')
        b = [int(n.replace('\\n','')) for n in a.split()]
        text = a+' avg: '+ str( np.mean(b) ) + ' \n '
        file2.write( text )
file2.close()
0

Символ новой строки был удален из набора, так как он будет генерировать ошибку.

1 -20 -100 50 60  
3 4 -100 -3  
-10 5 45 10 -15
with open('number.txt','r') as file1:
    file2 = open('text2.txt','w')
    line = file1.readlines()

    for s in line:
        # get the individual data and make them floating-point
        data = map(float, s.split()) 

        # doing stuffs with the data
        print(sum(data) / len(data))

Обновлен мой ответ после комментария @SpghttCd. Теперь вы должны иметь доступ к столбцам.

with open('number.txt','r') as file1:
    file2 = open('text2.txt','w')

    # recreating the matrix get the individual data and make them floating-points
    m = list([map(float, s.split()) for s in file1.readlines()])

    # calculations in lines
    print(sum(m[0]) / len(m[0]))
    print(sum(m[1]) / len(m[1]))
    print(sum(m[2]) / len(m[2]))

    # calculations in columns
    c = [l[0] for l in m]
    print(sum(c) / len(c))

    # or in a way more like what you tried
    tmp = 0
    for j in range(len(m)): # accessing the first columns of each line of the matrix
        tmp += int(m[j][0]) / len(m[j])
    print(tmp)
  • 0
    ИМО ваше решение не имеет среднего значения над столбцами
  • 0
    Вы правы я не учел.
Показать ещё 1 комментарий
0
with open(r"G:\python1.txt","r") as f1:
   with open(r"G:\output.txt","w") as f2:
    l=f1.readlines()
    for li in l:
        li=li.replace("\n","")
        temp=li.split(" ")
        sum=0
        for x in temp:
            avg=0
            sum=sum+int(x)
        avg=sum/len(temp)
        temp1=str(round(avg))
        l1=str(li)
        print("l1",l1)
        f2.write(l1+" "+ "avg:"+temp1)
        f2.write("\n")
  • 0
    Вы должны предоставить краткое объяснение вашего ответа
  • 0
    Я думаю, что вы забыли среднее значение Колумма

Ещё вопросы

Сообщество Overcoder
Наверх
Меню