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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:16:03