【问题标题】:Python numpy averagingPython numpy 平均
【发布时间】:2011-11-12 18:45:22
【问题描述】:

平均这样的表不是问题

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: 使用序列设置数组元素。

【问题讨论】:

  • 您的数据来自哪里,为什么子列表长度不一样?
  • 基因组数据,不同基因长度
  • 这可能不是一个好问题,但是——你必须使用 numpy 吗?

标签: python numpy average


【解决方案1】:

您可以将数据输入一个 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 操作对数组执行以使设置数组的初始成本值得时才投资制作掩码数组。

【讨论】:

  • @yosukesabai:谢谢。我也喜欢你的方法。请取消删除它:)
  • 未删除。了解设置成本很有趣,我经常忘记。
【解决方案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

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多