Python 求多个NumPy数组的中值

Python 求多个NumPy数组的中值,python,numpy,Python,Numpy,我有一个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

我有一个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
您可以这样做:

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

Numpy.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阵列而不使用循环,那就更好了

与python循环相比,让NumPy这样做的时机非常紧迫:

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

您可以使用
zip
map
来获取迭代器:

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.])