如何在NumPy中针对反对角轴转置矩阵并替换NaN值?
解决方案:用反对角非NaN值替换矩阵NaN
问题分析
你需要对n阶方阵执行反对角轴的NaN替换:仅用反对角位置的非NaN值填充对应位置的NaN,而非直接交换反对角元素。现有代码的问题在于直接交换反对角的两个元素,会破坏原有非NaN值,不符合需求。
反对角位置的对应关系:对于n阶方阵,位置(i,j)的反对角位置为(n-1-j, n-1-i)。我们需要的逻辑是:
- 若当前位置是NaN,且反对角位置非NaN,则用反对角的值填充当前位置;
- 若反对角位置是NaN,且当前位置非NaN,则用当前值填充反对角位置;
- 若两者都非NaN或都为NaN,则不做处理。
修改后的代码
import numpy as np def fill_anti_diagonal_nan(mat): n = mat.shape[0] # 复制原矩阵,避免修改输入的原始数据 result = mat.copy() for i in range(n): for j in range(n - i): # 计算当前位置的反对角位置坐标 anti_i = n - 1 - j anti_j = n - 1 - i # 跳过已处理的位置(避免重复操作同一对) if i > anti_i or (i == anti_i and j > anti_j): continue # 获取两个位置的值 current_val = result[i, j] anti_val = result[anti_i, anti_j] # 用非NaN值替换对应NaN if np.isnan(current_val) and not np.isnan(anti_val): result[i, j] = anti_val elif np.isnan(anti_val) and not np.isnan(current_val): result[anti_i, anti_j] = current_val return result # 测试输入矩阵 m = np.array([[np.nan, 9, np.nan, 5], [ 3, 4, np.nan, 6], [np.nan, np.nan, np.nan, 7], [np.nan, 2, np.nan, 8]]) # 输出结果 print(fill_anti_diagonal_nan(m))
输出验证
运行代码后,输出结果与预期完全一致:
[[ 8. 9. 6. 5.] [ 3. 4. nan 6.] [ 2. nan 4. 7.] [nan 2. 3. 8.]]
代码说明
- 复制矩阵:使用
mat.copy()避免修改原始输入矩阵,保证数据安全性; - 遍历逻辑:通过双层循环遍历所有需要处理的反对角对,跳过已处理的位置避免重复操作;
- NaN判断:使用
np.isnan()判断值是否为NaN,针对性地进行填充替换; - 保留原值:仅处理存在NaN的情况,非NaN值保持不变,符合需求。
内容的提问来源于stack exchange,提问作者Medulla Oblongata
相关产品推荐
相关产品推荐

