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

如何高效构建统计坐标条件点数量的Numpy数组H?

高效计算二维累积计数数组H的方法

原方法通过广播生成三维数组(形状为(B,X,Y)),当B、X、Y达到数千级别时,会占用极大内存(例如B=2000,X=2000,Y=2000时,数组元素量达8e9),且时间复杂度为O(BXY),导致运行缓慢。以下是两种高效替代方案:

方法一:二维直方图+累积求和

利用x、y是b对应列的唯一排序数组的特性,先统计每个(x[i], y[j])组合的出现次数,再通过二维累积求和得到目标数组H。时间复杂度为O(B + XY),内存占用仅为O(XY)。

import numpy as np

b = np.random.random((2000,2))
x = np.unique(b[:,0])
y = np.unique(b[:,1])

# 构造包含所有元素的bins,确保x[-1]和y[-1]被正确统计
x_bins = np.concatenate([x, [x[-1] + np.finfo(x.dtype).eps]])
y_bins = np.concatenate([y, [y[-1] + np.finfo(y.dtype).eps]])

# 计算二维直方图,统计每个(x[i], y[j])的出现次数
hist, _, _ = np.histogram2d(b[:,0], b[:,1], bins=[x_bins, y_bins])

# 二维累积求和:先按行累积,再按列累积(顺序不影响最终结果)
H = hist.cumsum(axis=0).cumsum(axis=1)

方法二:索引映射+批量计数

通过np.searchsorted快速定位b中元素在x、y中的位置,再用np.add.at批量统计每个位置的出现次数,最后做累积求和。该方法避免了直方图的额外处理,大规模数据下性能更优。

import numpy as np

b = np.random.random((2000,2))
x = np.unique(b[:,0])
y = np.unique(b[:,1])

# 快速找到b中每个元素在x、y中的索引(x、y已排序,searchsorted效率极高)
idx_x = np.searchsorted(x, b[:,0])
idx_y = np.searchsorted(y, b[:,1])

# 初始化计数数组,批量累加每个(x[i], y[j])的出现次数
hist = np.zeros((len(x), len(y)), dtype=np.int64)
np.add.at(hist, (idx_x, idx_y), 1)

# 二维累积求和得到目标数组H
H = hist.cumsum(axis=0).cumsum(axis=1)

原理说明

两种方法的核心逻辑一致:

  1. 先统计每个(x[i], y[j])组合的出现次数,避免原方法中重复的元素比较操作;
  2. H[i,j]等价于直方图中左上角到(i,j)区域的总和,二维累积求和可高效计算该值,彻底规避了三维数组的内存和性能开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:42:51