基于NumPy的高效分箱分配实现:大1D数组分组需求问询
嘿,这个需求我太熟了!处理大数组的分组分箱,既要效率拉满又要结果符合预期,咱们用Python里的现成工具就能轻松搞定,不用自己写低效循环折腾~
方案1:用Pandas快速实现(最直观)
Pandas的groupby天生就是干这个的,对于100k级别的数据完全不在话下,代码也简洁易懂:
import pandas as pd import numpy as np # 假设x和d是numpy数组或者普通列表 df = pd.DataFrame({'x': x, 'd': d}) # 按x的取值分组,把每个组对应的d元素收集成列表 grouped_data = df.groupby('x')['d'].apply(list) # 提取唯一x值向量v(就是分组的索引) v = grouped_data.index.values # 把各组的d列表转成矩阵,短的组用NaN补全对齐(如果组大小不一致的话) max_group_size = max(len(lst) for lst in grouped_data) b = np.array([lst + [np.nan]*(max_group_size - len(lst)) for lst in grouped_data]).T
小说明:这里矩阵b的每一列对应v里的一个唯一x值,每一行是该组的一个d元素。如果所有组的元素数量相同,那矩阵里就不会有NaN,完美对齐。
方案2:纯Numpy实现(无额外依赖)
如果你不想引入Pandas,纯Numpy也能搞定,用unique和布尔索引就能实现高效分组:
import numpy as np # 获取唯一值v,以及原数组x中每个元素对应的组索引(即该元素在v中的位置) v, group_indices = np.unique(x, return_inverse=True) # 统计每个组的元素数量,找到最大组的大小 group_counts = np.bincount(group_indices) max_group_size = group_counts.max() # 初始化矩阵b,用NaN填充所有位置 b = np.full((max_group_size, len(v)), np.nan) # 逐个组填充对应的d元素 for group_idx in range(len(v)): # 取出当前组的所有d元素 current_d = d[group_indices == group_idx] # 把这些元素填充到矩阵的第group_idx列 b[:len(current_d), group_idx] = current_d
性能提示:这两种方法都经过了底层优化,对于10k-100k的数组,运行时间都是毫秒级的,完全不用担心性能问题。唯一值15k的情况下,循环15次也不会有任何卡顿。
可选调整
如果不需要用NaN补全,而是想用其他值(比如0),只需要把代码里的np.nan换成你需要的填充值就行;如果所有组的元素数量确定相同,那可以直接跳过补全步骤,直接转成矩阵。
内容的提问来源于stack exchange,提问作者rava
相关产品推荐
相关产品推荐

