我会用
numpy
在这里,用
roll
:
# distance to 0
N = 5
# replace diagonal with 0
np.fill_diagonal(a.values, 0)
# build mask
m = (a==0).to_numpy()
# apply mask iteratively
for i in range(1, a.shape[1]//N):
a[np.roll(m, i*N, axis=1)] = 1
使用熊猫的变体
shift
:
N = 5
np.fill_diagonal(a.values, 0)
m = (a==0)
for i in range(1, a.shape[1]//N):
a[m.shift(i*N, axis=1, fill_value=False)] = 1
a[m.shift(-i*N, axis=1, fill_value=False)] = 1
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 0.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9
1 0.9 0.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9
2 0.9 0.9 0.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9
3 0.9 0.9 0.9 0.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 1.0 0.9
4 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 1.0
5 1.0 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9
6 0.9 1.0 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9
7 0.9 0.9 1.0 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9
8 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9 0.9 1.0 0.9
9 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9 0.9 1.0
10 1.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9 0.9
11 0.9 1.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 0.0 0.9 0.9 0.9
12 0.9 0.9 1.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 0.0 0.9 0.9
13 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 0.0 0.9
14 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 1.0 0.9 0.9 0.9 0.9 0.0
输出为图像以提高清晰度: