如何找到不同大小列表的中位数

时间:2018-12-15 00:48:59

标签: python numpy

我有一个数字列表,我想将它们分类到垃圾箱中,并找到每个垃圾箱的中位数。如果所有垃圾箱都具有相同数量的数据点,那么使用numpy数组可以很容易地有效地做到这一点:

import numpy as np    
indices=np.array([0,1,0,1,1,2,3,3,3,2,0,2])
length=np.max(indices)+1
data = np.arange(len(indices))
binned = np.array([data[indices == i] for i in range(length)])

然后是合并的数据(在数组binned中)

array([[ 0,  2, 10],
   [ 1,  3,  4],
   [ 5,  9, 11],
   [ 6,  7,  8]])

每个垃圾箱的中位数是:

np.median(binned, axis=1)

结果:

array([2., 3., 9., 7.])

但是,如果列表使得每个bin中有不同数量的点(或某些bin中没有点),则我无法创建numpy数组或使用np.median,而必须执行for循环中的繁重任务:

indices=np.array([0,1,1,1,3,1,1,0,0,0,3])
data = np.arange(len(indices))

合并的数据是

[data[indices == i] for i in range(length)]

[array([0, 7, 8, 9]),
 array([1, 2, 3, 5, 6]),
 array([], dtype=int64),
 array([ 4, 10])]

但是我不能取数组列表的中位数。相反,我可以做

[np.median(data[indices == i]) for i in range(length)]

并获得

[7.5, 3.0, nan, 7.0]

但是for循环非常慢。 (我的真实数据中有数百万个数据点和数以万计的bin。)

有没有一种方法可以避免严重依赖于for循环(甚至完全摆脱for循环)?

1 个答案:

答案 0 :(得分:1)

只需将两列放在innerHTML DataFrame中,就可以通过按“索引”分组轻松地计算中位数。让我们在实践中看一下:

pandas