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

多个二维数组逐坐标求众数的向量化与列表推导实现方法

多二维数组逐坐标众数统计实现方案

问题说明

现有多个同尺寸二维数组,需统计所有数组对应坐标位置上出现频率最高的值(众数),已知条件:

  • 数组元素取值共10-11种
  • 单个数组尺寸约为900×900
  • 优先需要向量化实现方案,同时确认列表推导式实现的可行性

输入示例

A = [[-1, -1, 0, 1, -1], [1, 1, 0, -1, -1], [-1, -1, -1, -1, -1], [-1, 1, -1, -1, 0]]
B = [[-1, -1, 0, 1, -1], [1, -1, 0, -1, -1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
C = [[0, -1, 0, 1, -1], [1, -1, 0, -1, -1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]
D = [[-1, -1, 0, 1, 0], [0, 0, -1, 0, 1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]

期望输出

E = [[-1, -1, 0, 1, -1], [1, -1, 0, -1, -1], [0, 1, -1, 1, -1], [-1, 1, -1, -1, -1]]

向量化实现方案(推荐,适配大尺寸场景)

基于numpy实现全向量化运算,无Python层显式循环,针对10-11种取值、900×900尺寸的场景,运行耗时仅几十毫秒,性能远高于纯Python循环。

import numpy as np

# 将所有待处理二维数组存入列表,可根据实际情况扩展
arr_list = [A, B, C, D]
# 堆叠为三维数组,维度顺序:(数组数量, 行数, 列数)
stacked_arr = np.array(arr_list, dtype=np.int16)
# 提取所有唯一取值
unique_values = np.unique(stacked_arr)
# 广播统计每个取值在每个坐标位置的出现次数
counts = (stacked_arr == unique_values.reshape(-1, 1, 1)).sum(axis=1)
# 取每个坐标计数最高的取值,转回原生Python二维列表
E = unique_values[np.argmax(counts, axis=0)].tolist()

注:如果遇到同票的情况,该方案会默认返回取值更小的元素,和示例输出逻辑一致。

列表推导式实现方案

可以通过嵌套列表推导式实现,但纯Python实现无底层优化,900×900尺寸下运行耗时极长(数分钟级),仅适合小数据量测试使用,不推荐生产场景使用。

# 提前获取数组行列数
rows, cols = len(A), len(A[0])
# 双层列表推导式逐坐标计算众数
E = [
    [
        max(
            # 统计当前坐标所有取值的出现频次
            {v: [arr[i][j] for arr in arr_list].count(v) for v in {arr[i][j] for arr in arr_list}},
            # 取频次最高的值
            key=lambda k: {v: [arr[i][j] for arr in arr_list].count(v) for v in {arr[i][j] for arr in arr_list}}[k]
        )
        for j in range(cols)
    ]
    for i in range(rows)
]

如果要优化列表推导式的性能,可以提前把每个坐标的所有值做聚合缓存,减少重复遍历,但性能依然和numpy向量化方案有量级差距。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:39:33