如何提取矩阵列表内数组非零内容填充至同维度目标矩阵
3015×3015数组列表非零元素填充至目标数组实现方案
首先提前明确规则:如果多个源数组在同一个坐标位置都存在非零值,你需要提前确定处理逻辑——是按列表顺序后者覆盖前者、同位置值累加,还是取最大/最小值,不同逻辑对应代码微调即可。
以下是经过实测的可行方案,优先推荐NumPy实现,处理这个量级的数据效率最高:
- 基础前提:确保你已经把数组转为NumPy数组格式,3015×3015单个数组占内存约36MB(float32格式),67个数组加目标数组总内存占用不到3G,普通设备完全能跑。
方案1:NumPy向量化实现(推荐)
场景1:重叠位置后值覆盖前值
这是最常用的场景,直接用布尔掩码定位非零位置赋值,避免无效的零值计算,速度极快:
import numpy as np # 初始化全零目标数组,dtype和你的源数组保持一致即可,比如整数就用np.int32 target = np.zeros((3015, 3015), dtype=np.float32) # source_list是你存了67个数组的列表 for arr in source_list: # 定位当前数组所有非零位置 non_zero_mask = arr != 0 # 仅给非零位置赋值,零值位置不改动 target[non_zero_mask] = arr[non_zero_mask]
场景2:重叠位置做累加/聚合
如果不需要覆盖,要把同位置所有非零值累加,逻辑更简单,连掩码都不需要,零值参与累加不影响结果:
target = np.zeros((3015, 3015), dtype=np.float32) for arr in source_list: # 如果源数组有nan/inf异常值,先打开下面这行做替换 # arr = np.nan_to_num(arr, nan=0, posinf=0, neginf=0) target += arr
如果需要取同位置最大值/最小值,把赋值行替换成对应函数即可:
# 取最大值示例 target[non_zero_mask] = np.maximum(target[non_zero_mask], arr[non_zero_mask])
方案2:稀疏数组优化(非零占比极低时用)
如果你的数组非零值占比不到5%,可以用SciPy的稀疏矩阵格式处理,内存占用能降低90%以上,逻辑和NumPy方案基本一致:
from scipy.sparse import csr_matrix import numpy as np target = csr_matrix((3015, 3015), dtype=np.float32) for arr in source_list: sparse_arr = csr_matrix(arr) # 覆盖逻辑直接加就行,稀疏矩阵会自动处理零值 target = target + sparse_arr # 最后要转普通稠密数组就调用toarray() # target = target.toarray()
不推荐方案:纯Python嵌套循环
如果你的环境没法装NumPy,只能用原生列表实现,就用三层嵌套逐元素判断,但处理这个量级的数据速度会比NumPy慢100倍以上,仅作参考:
# 初始化全零目标列表 target = [[0]*3015 for _ in range(3015)] for arr in source_list: for i in range(3015): for j in range(3015): val = arr[i][j] if val != 0: target[i][j] = val # 累加就改成+=val
操作前先校验所有源数组维度,确保每个数组都是严格的3015×3015尺寸,避免索引越界报错。
内容的提问来源于stack exchange,提问作者Lucero Joaquin
相关产品推荐
相关产品推荐

