计算一组数据点代码修改间隔的平均值

2024-04-24 08:40:33 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:我把问题转到codereview.stackexchange

我正在尝试分析我的运行数据,它以gpx的形式出现,数据的导入和写入工作非常出色。你知道吗

现在,我要平均计算超过一定距离(例如1000米)的两点之间的速度,并将结果视为每公里的列表。如果最后一公里没有跑完,我想计算最后一段的速度。你知道吗

该函数具有以下输入:

average_over_distance(input_datalist, input_distancelist, average_distance)
    input_datalist = [0, 5.3, 4.3, 4.6 ... ]
    input_distancelist = [0, 4.5, 7.8, 12.3 ... ]
    average_distance = 1000

式中,input_datalist是每个数据点的速度,input_distancelist是从开始到这个数据点覆盖的米数。我已经写了一些代码,这是工作,但出人意料的慢,有一个小错误,其中最后一项需要删除,因为它将永远是一个零。你知道吗

如果有人能看一下并提出一些改进建议(特别是在性能方面),那将非常有帮助。你知道吗

# import numpy
import numpy as np

# defined a function to find the nearest value to a given one    
def find_nearest(array,value):
    idx = np.searchsorted(array, value, side="left")
    if idx > 0 and (idx == len(array) or math.fabs(value - array[idx-1]) < math.fabs(value - array[idx])):
        return array[idx-1]
    else:
        return array[idx]


# defined a function to calculate the average between two points of a list    
def mean(numbers):
    return float(sum(numbers)) / max(len(numbers), 1)


# defined main function    
def average_over_distance(input_datalist, input_distancelist, average_distance):

    output_average_list = []
    ratio_steps = int(input_distancelist[-1]/average_distance)

    distance_steps = range(average_distance,(ratio_steps+2)*average_distance,average_distance)

    for index1, elements1 in enumerate(input_distancelist):
        for index2, elements2 in enumerate(distance_steps):
            if elements1 == find_nearest(input_distancelist,elements2):
                if index2 == 0:
                    cutoff_index_start = 0
                    cutoff_index_end = index1
                else:
                    cutoff_index_start = cutoff_index_end+1
                    cutoff_index_end = index1

                output_average_list.append(mean(input_datalist[cutoff_index_start:cutoff_index_end]))
            # TODO: The last file will always be zero... Reason unclear... going from "distance_steps = range(average_distance,(ratio_steps+1)*average_distance,average_distance)" to "distance_steps = range(average_distance,(ratio_steps+2)*average_distance,average_distance) does not help
    del output_average_list[-1]

    return output_average_list

Tags: to数据inputindexreturnvaluestepsarray