如何基于索引合并Numpy二维数组中相同x值对应的y值?
刚好遇到过类似的需求,给你两个简洁高效的实现方案,尤其适配你提到的Timestamp类型场景:
方法一:纯Numpy实现(适合数值型x,Timestamp可兼容转换)
如果你的x是数值类型,用Numpy的原生方法效率极高;如果是Timestamp类型,只需要先把它转成对应的整数时间戳,处理完再转回去就行。
针对你的示例数组,代码如下:
import numpy as np # 你的示例数组 arr = np.array([[0,0],[1,1],[2,4],[4,6],[2,2],[3,7],[1,9],[4,16],[5,1],[5,2],[0,0]]) x = arr[:, 0] y = arr[:, 1] # 获取唯一x值和分组索引 unique_x, group_indices = np.unique(x, return_inverse=True) # 按索引分组求和y值 summed_y = np.bincount(group_indices, weights=y) # 组合成结果数组 result = np.column_stack((unique_x, summed_y)) print(result)
如果x是Timestamp类型,只需要加一步类型转换:
from pandas import Timestamp import numpy as np # 构造含Timestamp的测试数组 ts_arr = np.array([[Timestamp('2018-01-01'), 1], [Timestamp('2018-01-01'), 3], [Timestamp('2018-01-02'), 5]], dtype=object) x_ts = ts_arr[:, 0] y_ts = ts_arr[:, 1].astype(int) # 将Timestamp转为int64格式的时间戳数值 x_int = np.array([ts.value for ts in x_ts]) # 重复上面的分组求和步骤 unique_x_int, group_indices = np.unique(x_int, return_inverse=True) summed_y_ts = np.bincount(group_indices, weights=y_ts) # 再把int64转回Timestamp unique_x_ts = np.array([Timestamp(int(ts_int)) for ts_int in unique_x_int]) # 得到最终结果 result_ts = np.column_stack((unique_x_ts, summed_y_ts)) print(result_ts)
方法二:用Pandas实现(直观简洁,完美支持Timestamp)
Pandas对时间序列的处理天生友好,尤其是Timestamp类型,不需要额外转换,代码可读性也更强,非常适合你的实际场景:
针对示例数组的代码:
import pandas as pd import numpy as np # 你的示例数组 arr = np.array([[0,0],[1,1],[2,4],[4,6],[2,2],[3,7],[1,9],[4,16],[5,1],[5,2],[0,0]]) # 转成DataFrame df = pd.DataFrame(arr, columns=['x', 'y']) # 按x分组求和y,再重置索引 summed_df = df.groupby('x')['y'].sum().reset_index() # 转回numpy数组 result = summed_df.to_numpy() print(result)
针对Timestamp类型的场景,直接用就行,完全不需要额外转换:
from pandas import Timestamp import pandas as pd import numpy as np # 含Timestamp的测试数组 ts_arr = np.array([[Timestamp('2018-01-01'), 1], [Timestamp('2018-01-01'), 3], [Timestamp('2018-01-02'), 5]], dtype=object) df_ts = pd.DataFrame(ts_arr, columns=['x', 'y']) # 确保y列是数值类型(避免object类型求和出错) df_ts['y'] = df_ts['y'].astype(int) # 分组求和 summed_df_ts = df_ts.groupby('x')['y'].sum().reset_index() # 转回numpy数组 result_ts = summed_df_ts.to_numpy() print(result_ts)
方案选择建议
- 如果你的数据量极大且x是纯数值类型,优先选Numpy方案,效率更高;
- 如果x是Timestamp类型,或者追求代码简洁易读,Pandas方案是最优解,几乎不需要额外处理就能完美适配。
内容的提问来源于stack exchange,提问作者Richard Lucky
相关产品推荐
相关产品推荐

