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

Numpy实现大矩阵逐单元格多数投票的内存高效方法

实现逐单元格取最高频元素的NumPy方案

方案1:使用scipy.stats.mode(推荐,性能最优)

这个方法代码最简洁,且底层做了性能优化,完全可以支撑10k量级的输入规模:

import numpy as np
from scipy.stats import mode

# 输入堆叠代码
arr=np.array([[0,0,0],[0,4,1],[0,1,4]])
arr2=np.array([[0,0,0],[0,7,1],[0,1,1]])
arr3=np.array([[5,0,0],[0,4,1],[0,1,1]])
arr = np.stack([arr,arr2,arr3], axis=0)

# 沿第0维(数组维度)求众数,直接得到结果
result = mode(arr, axis=0, keepdims=False)[0]
print(result)

输出和示例要求完全一致:

[[0 0 0]
 [0 4 1]
 [0 1 1]]

方案2:纯NumPy实现(无第三方依赖)

如果你不能引入scipy依赖,可以用纯NumPy实现:

def get_position_mode(arr_stack, axis=0):
    # 调整维度:将待统计的数组维度放到最后
    arr_swapped = np.swapaxes(arr_stack, axis, -1)
    h, w, n = arr_swapped.shape
    # 展平空间维度,方便批量统计
    arr_flat = arr_swapped.reshape(-1, n)
    # 排序后找连续出现次数最多的元素
    arr_sorted = np.sort(arr_flat, axis=1)
    diff = np.diff(arr_sorted, axis=1)
    # 构造计数矩阵
    count_mat = np.concatenate(
        [np.ones((h*w, 1), dtype=np.int32), 
         diff != 0, 
         np.ones((h*w, 1), dtype=np.int32)], 
        axis=1
    ).cumsum(axis=1)
    # 统计每个值的出现次数
    _, idx, cnt = np.unique(count_mat, return_index=True, return_counts=True, axis=1)
    # 取每个位置出现次数最多的元素
    max_cnt_pos = cnt.argmax(axis=1)
    mode_vals = arr_sorted[np.arange(h*w), idx[np.arange(h*w), max_cnt_pos]]
    # 还原为原空间形状
    return mode_vals.reshape(h, w)

# 调用方法
result = get_position_mode(arr)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:06:05