删除形状为(128,116,116,1)的4D数组对角元素的代码如何修正?
问题原因
你的现有代码存在三个核心问题:
- 循环内每次都直接覆盖
X_test_LRP变量,最终只会保留最后一个样本的处理结果,自然形状只有(116,115) - 处理后没有保留样本维度和最后的通道维度,无法得到4D结构
- 循环遍历单个样本的写法效率极低,numpy支持广播操作直接批量处理整个数组
高效无循环解决方案
你可以直接通过掩码广播实现需求,最终输出形状为(128, 116, 115, 1)的4D数组:
import numpy as np # 生成116x116的对角掩码,对角位置标记为True diag_mask = np.eye(116, dtype=bool) # 扩展掩码维度匹配4D数组,过滤对角元素后重新reshape为4D结构 X_test_LRP = X_test[~diag_mask[np.newaxis, :, :, np.newaxis]].reshape(128, 116, 115, 1)
原有循环写法修正
如果你坚持要使用循环实现,可以提前初始化结果数组,每次循环给对应样本位置赋值:
# 提前初始化4D结果数组 X_test_LRP = np.zeros((X_test.shape[0], 116, 115, 1), dtype=X_test.dtype) for teste in range(X_test.shape[0]): single_sample = X_test[teste, :, :, 0] # 去掉对角元素后reshape,赋值到结果数组对应位置 X_test_LRP[teste, :, :, 0] = single_sample[~np.eye(116, dtype=bool)].reshape(116, 115)
内容的提问来源于stack exchange,提问作者Iugo
相关产品推荐
相关产品推荐

