仅使用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
相关产品推荐
相关产品推荐

