如何将物理位置访问记录1D数组转换为访问计数2D numpy矩阵
实现方案
核心采用numpy原生向量化统计逻辑,无Python层循环,处理大规模数组时性能优异,且易扩展。
具体实现代码
import numpy as np locations = [1,2,4,4,3,2,2,4,1,4] # 统计各位置访问次数:bincount默认从0开始计数,切片[1:]后索引0/1/2/3分别对应位置1/2/3/4的访问量 counts = np.bincount(locations, minlength=5)[1:] # 按行优先规则重塑为2x2数组,正好匹配要求的位置映射规则 result = counts.reshape(2, 2) print(result) # 输出: # [[2 3] # [1 4]]
方案说明
- 性能表现:
np.bincount是numpy底层C实现的计数函数,时间复杂度O(n),处理百万级以上规模的位置数组时,运行效率比Python原生循环、字典统计等方案高1~2个数量级,内存开销也更低。 - 扩展性:如果后续需要适配更大尺寸的网格(比如N×N规格,对应位置编号1到N²,按行优先顺序排布),仅需要将
reshape(2,2)修改为reshape(N, N)即可,其余逻辑无需调整。 - 适配特殊场景:如果位置编号存在不连续的情况,可以替换计数逻辑为
np.unique(locations, return_counts=True)[1],再配合位置索引映射即可,同样保持高性能。
内容的提问来源于stack exchange,提问作者dcoolwater0502
相关产品推荐
相关产品推荐

