在定义的对角线周围的 numpy 数组中设置递增值

Setting increasing values in a numpy array around a defined diagonal

在 python 中创建二维列表(或 numpy 数组)的最佳方法是什么,其中对角线设置为 -1,其余值从 0 增加 1,对于不同的值的 n。例如,如果 n = 3,数组将如下所示:

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

或 n = 4:

[[-1,0,1,2]
 [3,-1,4,5]
 [6,7,-1,8]
 [9,10,11,-1]]

等等

我知道我可以创建一个包含零且对角线设置为 -1 的数组: 一 = numpy.zeros((n,n)) numpy.fill_diagonal(a,-1)

所以如果 n = 3 这将给出:

[[-1,0,0]
 [0,-1,0]
 [0,0,-1]]

但是我如何将 0 设置为递增数字,如上例所示?我是否需要遍历并通过循环设置值?或者有更好的方法来解决这个问题吗?

提前致谢。

一种方法-

def set_matrix(n):
    out = np.full((n,n),-1)
    off_diag_mask = ~np.eye(n,dtype=bool)
    out[off_diag_mask] = np.arange(n*n-n)
    return out

样品运行 -

In [23]: set_matrix(3)
Out[23]: 
array([[-1,  0,  1],
       [ 2, -1,  3],
       [ 4,  5, -1]])

In [24]: set_matrix(4)
Out[24]: 
array([[-1,  0,  1,  2],
       [ 3, -1,  4,  5],
       [ 6,  7, -1,  8],
       [ 9, 10, 11, -1]])

这里有一个算术方式:

m=np.arange(n*n).reshape(n,n)*n//(n+1)
m.flat[::n+1]=-1

对于 n=5 :

[[-1  0  1  2  3]
 [ 4 -1  5  6  7]
 [ 8  9 -1 10 11]
 [12 13 14 -1 15]
 [16 17 18 19 -1]]