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

如何按mask_id快速计算二维NumPy数组的均值?

按mask_id分组计算NumPy数组的均值(高效实现)

问题场景

我有一个二维NumPy数组,最后一列是mask_id,需要对相同mask_id对应的前三维元素计算均值:

import numpy as np

# x, y, z, mask_id
data = np.array([[ 3.28246069,  3.63800144, -1.66515279,  0],
                 [ 3.28246069,  3.63800144, -1.66515279,  0],
                 [ 0.,  0., 0.,  1]])

期望输出:

# mean value of each mask id
array([[3.28246069,  3.63800144, -1.66515279], [0, 0, 0]])

高效实现方法

方法1:NumPy原生unique+bincount(推荐,纯NumPy无依赖)

适合mask_id为整数的场景,无需排序,性能最优:

import numpy as np

data = np.array([[ 3.28246069,  3.63800144, -1.66515279,  0],
                 [ 3.28246069,  3.63800144, -1.66515279,  0],
                 [ 0.,  0., 0.,  1]])

# 分离数据列和mask_id列
values = data[:, :3]
mask_ids = data[:, 3].astype(int)

# 获取唯一mask_id及逆索引(用于映射原始数据到分组)
unique_ids, inverse = np.unique(mask_ids, return_inverse=True)

# 统计每个分组的元素数量
counts = np.bincount(inverse)

# 对每个维度计算加权均值(权重为1,等价于总和除以数量)
mean_values = np.array([
    np.bincount(inverse, weights=values[:, i]) / counts 
    for i in range(values.shape[1])
]).T

print(mean_values)

输出:

array([[ 3.28246069,  3.63800144, -1.66515279],
       [ 0.        ,  0.        ,  0.        ]])

方法2:NumPyreduceat(适合已排序数据)

如果数据已经按mask_id排序,此方法效率极高;未排序时需先排序:

import numpy as np

data = np.array([[ 3.28246069,  3.63800144, -1.66515279,  0],
                 [ 3.28246069,  3.63800144, -1.66515279,  0],
                 [ 0.,  0., 0.,  1]])

# 按mask_id排序
sorted_idx = np.argsort(data[:, 3])
sorted_data = data[sorted_idx]

# 获取分组分割点
unique_ids, split_points = np.unique(sorted_data[:, 3], return_index=True)

# 按分割点计算分组均值
mean_values = np.add.reduceat(sorted_data[:, :3], split_points) / np.diff(
    np.append(split_points, len(sorted_data))
)

print(mean_values)

方法3:Pandas(代码简洁,适合多操作场景)

如果允许依赖Pandas,代码可读性最强,适合同时处理其他数据操作:

import pandas as pd
import numpy as np

data = np.array([[ 3.28246069,  3.63800144, -1.66515279,  0],
                 [ 3.28246069,  3.63800144, -1.66515279,  0],
                 [ 0.,  0., 0.,  1]])

df = pd.DataFrame(data, columns=['x', 'y', 'z', 'mask_id'])
mean_values = df.groupby('mask_id')[['x', 'y', 'z']].mean().values

print(mean_values)

方法选型建议

  • 方法1:纯NumPy实现,无额外依赖,大数据量下速度最快,优先选择。
  • 方法2:适合已排序的数据,排序后计算效率接近方法1。
  • 方法3:代码最简洁,适合需要同时做数据清洗、筛选等操作的场景。

内容的提问来源于stack exchange,提问作者dkanrjsk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:00:59