Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地计算平均值和中值_Python_Performance_Numpy_Mean_Median - Fatal编程技术网

Python 有效地计算平均值和中值

Python 有效地计算平均值和中值,python,performance,numpy,mean,median,Python,Performance,Numpy,Mean,Median,在Python列表中按顺序查找行的平均值和中位数的最有效方法是什么 例如,我的列表: input_list = [1,2,4,6,7,8] 我想生成一个输出列表,其中包含: output_list_mean = [1,1.5,2.3,3.25,4,4.7] output_list_median = [1,1.5,2.0,3.0,4.0,5.0] 其中,平均值计算如下: 1=平均值(1) 1.5=平均值(1,2)(即输入列表中前两个值的平均值) 2.3=平均值(1,2,4)(即输入列表中前3

在Python列表中按顺序查找行的平均值和中位数的最有效方法是什么

例如,我的列表:

input_list = [1,2,4,6,7,8]
我想生成一个输出列表,其中包含:

output_list_mean = [1,1.5,2.3,3.25,4,4.7]
output_list_median = [1,1.5,2.0,3.0,4.0,5.0]
其中,平均值计算如下:

  • 1=平均值(1)
  • 1.5=平均值(1,2)(即输入列表中前两个值的平均值)
  • 2.3=平均值(1,2,4)(即输入列表中前3个值的平均值)
  • 3.25=平均值(1,2,4,6)(即输入列表中前4个值的平均值) 等等
中位数的计算方法如下:

  • 1=中值(1)
  • 1.5=中值(1,2)(即输入列表中前两个值的中值)
  • 2.0=中值(1,2,4)(即输入列表中前3个值的中值)
  • 3.0=中值(1,2,4,6)(即输入列表中前4个值的中值) 等等
我尝试用下面的循环实现它,但它似乎效率很低

import numpy

input_list = [1,2,4,6,7,8]

for item in range(1,len(input_list)+1):
    print(numpy.mean(input_list[:item]))
    print(numpy.median(input_list[:item]))

您可以使用
itertools.islice
对数组进行切片,并使用
np.fromiter
np.mean

>>> arr=np.array([1,2,4,6,7,8])
>>> l=arr.size
>>> from itertools import islice
>>> [np.fromiter(islice(arr,0,i+1),float).mean(dtype=np.float32) for i in xrange(l)]
[1.0, 1.5, 2.3333333, 3.25, 4.0, 4.6666665]
作为一个备选答案,若你们想要平均值,你们可以使用它来获得元素的累积和,并使用
np与主数组进行除法。true\u divide

>>> np.true_divide(np.cumsum(arr),arr)
array([ 1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5])

您自己做的任何事情,特别是使用中间值,要么需要大量工作,要么效率非常低,但Pandas内置了您所追求的功能的高效实现,扩展平均值为O(n),扩展中间值为O(n*log(n)),使用跳过列表:

import pandas as pd
import numpy as np

input_list = [1, 2, 4, 6, 7, 8]

>>> pd.expanding_mean(np.array(input_list))
array([ 1.     ,  1.5    ,  2.33333,  3.25   ,  4.     ,  4.66667])

>>> pd.expanding_median(np.array(input_list))
array([ 1. ,  1.5,  2. ,  3. ,  4. ,  5. ])
使用
numpy.meshgrid
(还有其他公式)和
numpy.triu
创建一个包含您感兴趣的值的数组

x, y = np.meshgrid(a,a)
# y = a.repeat(len(a)).reshape(len(a), len(a))
c = np.triu(y)

>>> y
array([[1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2],
       [4, 4, 4, 4, 4, 4],
       [6, 6, 6, 6, 6, 6],
       [7, 7, 7, 7, 7, 7],
       [8, 8, 8, 8, 8, 8]])
>>> c
array([[1, 1, 1, 1, 1, 1],
       [0, 2, 2, 2, 2, 2],
       [0, 0, 4, 4, 4, 4],
       [0, 0, 0, 6, 6, 6],
       [0, 0, 0, 0, 7, 7],
       [0, 0, 0, 0, 0, 8]])
定义一个函数,返回所有非零值的中值,并将其应用于感兴趣的数组


谢谢@Kasra!我也可以用np找到顺序中值吗?@hoof\u欢迎!对不起,您所说的顺序中值是什么意思?如中所述,我需要找到第一个值(1)、前两个值(1,2)、前三个值(1,2,3)等的中值。在本例中,输出将是相同的(即输出列表=[1,1.5,2,2.5,3,3.5,4,4.5]),但我正在计算所有值的中值,而不是平均值。我希望是这样clear@hoof_hearted是的,这正是我的答案!cumsum的那部分很聪明!“似乎很低效”相比什么?你计时了吗?我怀疑
import numpy
在运行时占主导地位(您不需要它)
x, y = np.meshgrid(a,a)
# y = a.repeat(len(a)).reshape(len(a), len(a))
c = np.triu(y)

>>> y
array([[1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2],
       [4, 4, 4, 4, 4, 4],
       [6, 6, 6, 6, 6, 6],
       [7, 7, 7, 7, 7, 7],
       [8, 8, 8, 8, 8, 8]])
>>> c
array([[1, 1, 1, 1, 1, 1],
       [0, 2, 2, 2, 2, 2],
       [0, 0, 4, 4, 4, 4],
       [0, 0, 0, 6, 6, 6],
       [0, 0, 0, 0, 7, 7],
       [0, 0, 0, 0, 0, 8]])
def foo(a):
    '''return the the median of the non-zero elements of a 1d array
    '''
    return np.median(a[a.nonzero()])
d = np.apply_along_axis(foo, 0, c)

>>> d
array([ 1. ,  1.5,  2. ,  3. ,  4. ,  5. ])
>>>