基于指定列匹配索引值合并NumPy数组
解决方案:合并多组年份对齐的NumPy数组
针对你需要将多个年份-测量值数组合并为统一年份索引数组的需求,这里提供两种实用方法:
方法一:用Pandas快速实现(推荐)
Pandas的索引对齐机制天生适合这类任务,代码简洁且易维护:
import numpy as np import pandas as pd # 输入数据 arr1 = np.array([[1920, 1921, 1922, 1924, 1925], [23, 54, 23, 54, 65]]).T arr2 = np.array([[1922, 1923, 1924, 1925, 1926], [12, 43, 17, 42, 87]]).T # 将每个数组转为DataFrame,以年份为索引 df1 = pd.DataFrame(arr1, columns=["year", "arr1"]).set_index("year") df2 = pd.DataFrame(arr2, columns=["year", "arr2"]).set_index("year") # 合并DataFrame,自动对齐年份,缺失值填充NaN merged_df = pd.concat([df1, df2], axis=1).sort_index().reset_index() # 输出格式化结果 print(merged_df.to_string(index=False)) # 若需要转回NumPy数组: # result_array = merged_df.to_numpy()
运行后输出:
year arr1 arr2 1920 23 NaN 1921 54 NaN 1922 23 12 1923 NaN 43 1924 54 17 1925 65 42 1926 NaN 87
方法二:纯NumPy实现(无依赖)
如果不想引入Pandas,可以用NumPy的数组操作完成:
import numpy as np # 输入数据 arr1 = np.array([[1920, 1921, 1922, 1924, 1925], [23, 54, 23, 54, 65]]).T arr2 = np.array([[1922, 1923, 1924, 1925, 1926], [12, 43, 17, 42, 87]]).T # 收集所有唯一年份并排序 all_years = np.unique(np.concatenate([arr[:, 0] for arr in [arr1, arr2]])) all_years.sort() # 初始化结果数组:第一列存年份,其余列存对应测量值,默认填充NaN result = np.full((len(all_years), 1 + len([arr1, arr2])), np.nan) result[:, 0] = all_years # 遍历每个输入数组,填充对应测量值 for col_idx, arr in enumerate([arr1, arr2], start=1): # 找到当前数组年份在总年份列表中的位置 year_positions = np.searchsorted(all_years, arr[:, 0]) # 填充测量值到对应列 result[year_positions, col_idx] = arr[:, 1] # 格式化输出结果 print("year arr1 arr2") for row in result: year = int(row[0]) val1 = f"{row[1]:.0f}" if not np.isnan(row[1]) else "nan" val2 = f"{row[2]:.0f}" if not np.isnan(row[2]) else "nan" print(f"{year} {val1:<4} {val2}")
关键说明
- 避免了低效的逐行循环匹配,用
np.searchsorted快速定位年份位置,效率更高 np.full初始化数组时统一填充NaN,确保缺失值位置正确
内容的提问来源于stack exchange,提问作者captainjasper
相关产品推荐
相关产品推荐

