在NumPy中绕反对角线轴对矩阵进行转置

编程语言 2026-07-08

我想围绕反对角线轴对一个方阵进行转置:

illustration: 数组起始为 (1, 2, 3),(4, 5, 6),(7, 8, 9),并变为 (9, 6, 3),(8, 5, 2),(7, 4, 1)

我尝试将来自 一篇C++帖子 的代码改写成Python,以对我的矩阵进行转置:

import numpy as np

def swapEl(mat):
    # Transpose matrix about anti-diagonal
    num_rows, num_cols = mat.shape
    n = num_rows  # square matrix

    for i in np.arange(0, n, 1):
        for j in np.arange(0, n-i, 1):
            tmp = mat[i, j]
            mat[i, j] = mat[(n-1)-j, (n-1)-i]
            mat[(n-1)-j, (n-1)-i] = tmp
    return mat

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(swapEl(m))

我的矩阵包含 nan 个值。我打算只将 nan 替换成反对角线的数值:

起始:

[[nan  9. nan  5.]
 [ 3.  4. nan  6.]
 [nan nan nan  7.]
 [nan  2. nan  8.]]

结束:

[[ 8.  9.  6.  5.]
 [ 3.  4. nan  6.]
 [ 2. nan  4.  7.]
 [nan  2.  3.  8.]]

解决方案

要在numpy中围绕反对角线轴对矩阵 mat 进行转置,你可以很简单地使用:

np.flip(mat.T)

要在原始数组中填充NaN值,可以使用:

np.where(np.isnan(mat), np.flip(mat.T), mat)

完整示例:

import numpy as np

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]])
r = np.where(np.isnan(m), np.flip(m.T), m)
print(r)

输出:

[[ 8.  9.  6.  5.]
 [ 3.  4. nan  6.]
 [ 2. nan  4.  7.]
 [nan  2.  3.  8.]]
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章