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

如何在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.]]

代码说明

  1. 复制矩阵:使用mat.copy()避免修改原始输入矩阵,保证数据安全性;
  2. 遍历逻辑:通过双层循环遍历所有需要处理的反对角对,跳过已处理的位置避免重复操作;
  3. NaN判断:使用np.isnan()判断值是否为NaN,针对性地进行填充替换;
  4. 保留原值:仅处理存在NaN的情况,非NaN值保持不变,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.09 13:03:10