Python numpy平均值

时间:2011-11-12 18:45:22

标签: python numpy average

平均这样的表不是问题

table = [[1,2,3,0],[1,2,3,0],[1,2,3,4]]

你可以

print numpy.average(table,axis=0)

但如果我的序列不均匀如下:

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

然后结果应该是:

1,2,3,4

由于包含数字4的元素只出现一次。和4/1 = 4。 但是numpy不允许这样做。

  

ValueError:使用序列设置数组元素。

2 个答案:

答案 0 :(得分:3)

您可以将数据提供给numpy蒙面数组,然后使用np.ma.mean计算均值:

import numpy as np
import itertools
data=[[1,2,3],[1,2,3],[1,2,3,4]]

rows=len(data)
cols=max(len(row) for row in data)
arr=np.ma.zeros((rows,cols))
arr.mask=True
for i,row in enumerate(data):
    arr[i,:len(row)]=row

print(arr.mean(axis=0))

产量

[1.0 2.0 3.0 4.0]

当分配值时,数组的元素将被取消屏蔽(即arr.mask[i,j]=False)。请注意下面的结果掩码:

In [162]: arr
Out[162]: 
masked_array(data =
 [[1.0 2.0 3.0 --]
 [1.0 2.0 3.0 --]
 [1.0 2.0 3.0 4.0]],
             mask =
 [[False False False  True]
 [False False False  True]
 [False False False False]],
       fill_value = 1e+20)

如果您的数据很短,yosukesabai's method或纯Python解决方案可能比我上面显示的更快。如果数据非常大并且你有足够的numpy操作在阵列上执行以使设置数组的初始成本值得投入,那么只投资制作一个蒙面数组。

答案 1 :(得分:2)

我能想到的唯一解决方法是使用itertools和临时列表,不是很漂亮。

import numpy as np
from itertools import izip_longest
table = [[1,2,3],[1,2,3],[1,2,3,4]]

for row in izip_longest(*table):
    print np.average([x for x in row if x is not None])

这会产生

1.0
2.0
3.0
4.0