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
相关产品推荐
相关产品推荐

