【问题标题】:matrix with absolute difference between row and column index行和列索引之间具有绝对差异的矩阵
【发布时间】:2025-12-16 19:10:01
【问题描述】:

我想有效地创建以下形状的矩阵,即行号和列号之间的绝对差。例如。 5 我应该得到:

0 1 2 3 4
1 0 1 2 3
2 1 0 1 2
3 2 1 0 1
4 3 2 1 0

在 Python 中是否有一种快速/优雅的方式来做到这一点?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您可以使用简单的嵌套列表推导:

    n = 5
    [[abs(i-j) for j in range(n)]
     for i in range(n)]
    

    输出:

    [[0, 1, 2, 3, 4],
     [1, 0, 1, 2, 3],
     [2, 1, 0, 1, 2],
     [3, 2, 1, 0, 1],
     [4, 3, 2, 1, 0]]
    

    或者使用 numpy:

    import numpy as np
    n = 5
    a = np.arange(n)
    abs(a-a[:,None])
    

    【讨论】:

      【解决方案2】:

      三个辉煌更多:

      np.abs(np.diff(np.indices((n, n)), axis=0))
      np.abs(n - 1 - np.sum(np.indices((n, n)), axis=0)[::-1])
      np.abs(np.subtract.outer(np.arange(n), np.arange(n)))
      

      我认为使用np.absnp.indices 会变得有点乏味。努力做得更好……

      np.lib.stride_tricks.sliding_window_view(np.cumsum(np.repeat([n-1, -1, 1], [1, n-1, n-1])), n)[::-1].copy()
      

      完成!比第一个示例快 4 倍,比第三个示例快 2.3 倍。

      【讨论】: