【发布时间】: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 中是否有一种快速/优雅的方式来做到这一点?
【问题讨论】:
我想有效地创建以下形状的矩阵,即行号和列号之间的绝对差。例如。 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 中是否有一种快速/优雅的方式来做到这一点?
【问题讨论】:
您可以使用简单的嵌套列表推导:
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])
【讨论】:
三个辉煌更多:
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.abs 和np.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 倍。
【讨论】: