2013-06-11 6 views
3

내가 목록열 사이의 목록에있는 요소의 평균을 어떻게 계산합니까?

B = [[1,2,3],[1,2,3,4],[1,2]] 

의 배열을 말해봐 그리고 나는 coloumns에서 목록에있는 요소의 평균을 계산합니다. 어떻게해야합니까?

내가 가장 긴 목록과 동일한 평균 값의 최종 배열을 얻을 어떻게

예 :

[(1+1+1)/3,(2+2+2)/3,(3+3)/2,4/1] = [1,2,3,4] 

내가 시도 :

final_array = np.array([mean(a) for a in zip(*(B))]) 

를하지만 나에게 배열에만 제공 내 짧은 목록으로 오래. 이 마스크가 편리할까요? 목록 배열로 인해 싫증이 나면 사과드립니다. 아직 파이썬에 익숙해 져 있습니다.

답변

1

또 하나의 방법, cmp

from itertools import izip_longest 
[float(sum(col))/sum(cmp(x,0) for x in col) for col in izip_longest(*B, fillvalue=0)] 

이 당신의 가치는 긍정적 인 가정 izip_longest를 사용하여.

+1

참고 파이썬 3에서는'cmp'가 사라졌습니다. – jamylak

+0

목록에 0이 있으면 작동하지 않습니다. –

+0

감사합니다. 그러므로주의해야한다. –

4

당신은 약간의 센티넬 값 (NaN을 사용했습니다)으로 목록을 채운 다음 그 센티넬으로 마스크 된 배열을 생성해야합니다. 가면 배열을 얻었 으면 어떤 문제없이 평균을 계산할 수 있습니다. itertools.izip_longestitertools.takewhile를 사용

>>> import numpy as np 
>>> B = [[1,2,3],[1,2,3,4],[1,2]] 
>>> 
>>> maxlen = max(len(x) for x in B) 
>>> C = np.array([l+[np.nan]*(maxlen-len(l)) for l in B]) 
>>> C 
array([[ 1., 2., 3., nan], 
     [ 1., 2., 3., 4.], 
     [ 1., 2., nan, nan]]) 
>>> dat = np.ma.fix_invalid(C) 
>>> np.mean(dat,axis=0) 
masked_array(data = [1.0 2.0 3.0 4.0], 
      mask = [False False False False], 
     fill_value = 1e+20) 
+0

'NAN'을 마스크하는 가장 좋은 방법은 다음과 같습니다. np.ma.fix_invalid (C) – jamylak

+0

@jamylak - 그래, 그게 좀 깨끗한 것 같아. – mgilson

1

:

>>> from itertools import takewhile, izip_longest 
def means(lis): 
    fill = object() 
    for item in izip_longest(*lis,fillvalue = fill): 
     vals = list(takewhile(lambda x : x!=fill , item)) 
     yield sum(vals)/float(len(vals)) 
...   
>>> lis = [[1,2,3],[1,2,3,4],[1,2]] 
>>> lis.sort(key = len, reverse = True) #reverse sort the list based on length of items 
>>> list(means(lis)) 
[1.0, 2.0, 3.0, 4.0] 
0
B = [[1,2,3],[1,2,3,4],[1,2]] 
data = {} 
max_len = 0 

for alist in B: 
    length = len(alist) 
    max_len = length if (length > max_len) else max_len 

    for i in range(length): 
     data.setdefault(i, []).append(alist[i]) 


results = [] 

for i in range(max_len): 
    vals = data[i] 
    results.append(sum(vals)/len(vals)) 

print results 

--output:-- 
[1, 2, 3, 4] 
6

할 수 있습니다 그것은 팬더의 DataFrame를 사용하여.

from pandas import DataFrame 

B = [[1,2,3],[1,2,3,4],[1,2]] 
df = DataFrame(B) 
df.mean(axis=0) 
"""" 
df 
    0 1 2 3 
0 1 2 3 NaN 
1 1 2 3 4 
2 1 2 NaN NaN 

df.mean(axis=0) 
0 1 
1 2 
2 3 
3 4 
""" 
+0

+1 OP only numpy) – jamylak

0

당신은 외부 libs가없이 작업을 수행 할 수 있습니다

B = [[1,2,3],[1,2,3,4],[1,2]] 
#compute max length of sub list 
maxLen = max([len(x) for x in B]) 
#new list with number of empty lists equals to number of columns 
transList = [[] for i in range(maxLen)] 
#transforming list to new structure 
for row in B: 
    for col in row: 
     transList[col-1].append(col) 
#transList = [[1, 1, 1], [2, 2, 2], [3, 3], [4]] from now one its simple to get mean of the elements ;) 
meanB = [float(sum(i))/len(i) for i in transList] 
관련 문제