平均这样的表不是问题
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:使用序列设置数组元素。
答案 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