1

特定のネストされたリストの各列の平均を計算し、平均を新しいリストに保存する必要があります。これまでのコードでは、元のリストをネストされたリストに設定し、それを転置して列を読み取りました。平均をどのようにコーディングするのかわかりません。

#First open the data text file
import re

f = open('C:\Python27\Fake1.txt', 'r')

#Convert to a nested list
nestedlist = []
q = f.read()
f.close()
numbers = re.split('\n', q) #Splits the \n and \t out of the list
newlist = []
for row in numbers:
   newlist.append(row.split('\t'))


#Reading in columns
def mytranspose(nestedlist):
   list_prime = []
   for i in range(len(nestedlist[0])):
          list_prime.append([])
   for row in nestedlist:
          for i in range(len(row)):
                 list_prime[i].append(row[i])
   return(list_prime)
print (mytranspose(newlist))


#Average of Columns
def myaverage(nestedlist):
   avg_list = []
   a = 0
   avg = 0
   for i in newlist:
          a = sum(newlist[i])
          avg = a/len(row)
          avg_list.append(avg[i])
   return(list_prime)

print(myaverage(newlist))
4

2 に答える 2

10

全体を行う簡単な方法を次に示します。

with open('C:\Python27\Fake1.txt', 'r') as f:
    data = [map(float, line.split()) for line in f]

num_rows = len(data)
num_cols = len(data[0])

totals = num_cols * [0.0]
for line in data:
    for index in xrange(num_cols):
        totals[index] += line[index]

averages = [total / num_rows for total in totals]
print averages

ただし、この種のことにはnumpyを使用することをお勧めします。

import numpy as np
data = np.loadtxt('C:\Python27\Fake1.txt')
print data.mean(0)
于 2012-06-28T19:18:23.203 に答える
7

リストのリストがあるとします

table = [[1, 2, 3],  [10, 20, 30], [100, 200, 300]]

zip を使用して転置し、リストの元のリストを引数リストとして渡すことができます (アスタリスクの機能)。

transposed = zip(*table)
: [(1, 10, 100), (2, 20, 200), (3, 30, 300)]

これらの列の合計を取得するには、マップ関数を使用して各エントリをマップできます。

sums = map(sum, transposed)
: [111, 222, 333]

平均は合計を長さで割ったものなので、関数を使用してこれを行うことができます。

def avg(items):
    return float(sum(items)) / len(items)

または、ラムダでこれを行うことができます:

avg = lambda items: float(sum(items)) / len(items)

合計の代わりにこれを使用します。

averages = map(avg, transposed)

次のように、これをすべて 1 つの関数にまとめることができます。

table = [[1, 2, 3],  [10, 20, 30], [100, 200, 300]]
averages = map(lambda items: float(sum(items)) / len(items), zip(*table))

しかし、それは少し読みにくいので、一般的に分割する方が明確です:

table = [[1, 2, 3],  [10, 20, 30], [100, 200, 300]]
transposed = zip(*table)
avg = lambda items: float(sum(items)) / len(items)
averages = map(avg, transposed)
于 2012-06-28T19:24:09.610 に答える