Мой вопрос - как получить каждую среднюю матрицу и записать ее в новый текстовый файл.
Если содержимое текста
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)
Кажется, вы не хотите использовать 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
Вы можете использовать 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()
поскольку из вашего примера кажется, что вы хотите округлить.
Вот пример, используя 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()
Символ новой строки был удален из набора, так как он будет генерировать ошибку.
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)
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")