You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅使用numpy和scipy按年统计区间最大纬度值的实现问题求助

仅使用Numpy实现按年统计最大纬度的解决方案

你不需要手动编写相邻年份对比的逻辑,使用Numpy原生方法实现效率更高,也不会出现边界判断错误,以下是两种适用不同场景的可运行方案:

通用方案(数据未按时间排序也可使用)

该方案逻辑最简单,通用性最强,百万级数据量下也有足够的运行效率:

def max_per_year(x):
    year, lat = read_file(x)
    # 提取所有不重复的年份列表
    unique_years = np.unique(year)
    max_lat_per_year = {}
    for y in unique_years:
        # 布尔索引筛选当前年份对应的所有纬度,直接求最大值
        max_lat_per_year[y] = lat[year == y].max()
    return max_lat_per_year

返回结果为字典,键为年份,值为对应年份的最大纬度。

高性能方案(数据已按时间顺序排列时使用)

如果你的CSV数据本身是按时间先后顺序记录的,可以使用reduceat方法实现更高效率的分组计算,不需要重复遍历数据:

def max_per_year_sorted(x):
    year, lat = read_file(x)
    # 定位所有年份发生变化的索引位置
    change_points = np.where(np.diff(year) != 0)[0] + 1
    # 补充分组起始的第一个位置
    group_starts = np.concatenate(([0], change_points))
    # 按分组求最大值
    max_lats = np.maximum.reduceat(lat, group_starts)
    # 匹配对应年份
    years = year[group_starts]
    return dict(zip(years, max_lats))

手动循环方案(仅作逻辑参考)

如果你坚持要使用你原本的相邻年份对比的逻辑,需要注意处理边界问题,避免第一个元素索引越界,以及最后一年的数据遗漏:

def max_per_year_loop(x):
    year, lat = read_file(x)
    if not len(year):
        return {}
    res = {}
    current_year = year[0]
    current_max = lat[0]
    # 从第二个元素开始遍历,避免i-1越界
    for i in range(1, len(year)):
        if year[i] == current_year:
            current_max = max(current_max, lat[i])
        else:
            res[current_year] = current_max
            current_year = year[i]
            current_max = lat[i]
    # 存入最后一年的统计结果
    res[current_year] = current_max
    return res

内容的提问来源于stack exchange,提问作者eyad mardini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:24:02