寻找多个NumPy数组的中位数值

5

我有一个for循环,创建大约50个数组。这些数组的长度为240。我正在尝试找出计算每个数组元素的中位数的最佳方法。基本上,我想将循环中创建的每个数组的第一个元素放入一个列表中,并找到中位数。然后对其他239个元素执行相同的操作。我正在考虑类似下面的代码:

a = np.array([1,2,4,56,67,8,8,9]);

b = np.array([-1,-3,5,6,-7,-6,-8,0]);

c = np.array([1,2,3,4,5,6,7,8]);

d = []

d.append(a[0])

d.append(b[0])

d.append(c[0])

d
Out[62]: [1, -1, 1]

np.median(d)
Out[65]: 1.0
3个回答

7

Numpy.median可以在您想要的任何轴上取中间值。因此,如果您可以将所有单独的数组合并为一个数组,就可以调用np.median()一次性获取它们:

a = np.array([1,2,4,56,67,8,8,9]);
b = np.array([-1,-3,5,6,-7,-6,-8,0]);
c = np.array([1,2,3,4,5,6,7,8]);

d = np.stack([a, b, c])
np.median(d, axis = 0)

# array([1., 2., 4., 6., 5., 6., 7., 8.])

当然,如果您可以直接制作50x240的数组而无需使用循环,那就更好了。

让NumPy完成这项工作的时间比使用Python循环更具吸引力:

l = [np.random.rand(240) for _ in range(50)]

def one(l):
    return np.array(list(map(np.median, zip(*l))))

def two(l):
    d = np.stack(l)
    return np.median(d, axis = 0)

> %timeit one(l)
  17 ms ± 1.17 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
> %timeit two(l)
  456 µs ± 39.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each

4

你可以按照以下方式进行:

medians = [np.median([a[i],b[i],c[i]]) for i in range(len(a))]

3
您可以使用 zipmap 结合起来获取一个迭代器:
map(np.median, zip(a, b, c))

如果您想将其作为一个numpy数组使用,可以使用:

np.array(list(map(np.median, zip(a, b, c))))

输出:

数组([1., 2., 4., 6., 5., 6., 7., 8.])


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接