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

Python 围绕定义的对角线在numpy数组中设置递增值,python,arrays,numpy,nested-lists,diagonal,Python,Arrays,Numpy,Nested Lists,Diagonal,在python中创建2D列表(或numpy数组)的最佳方法是什么?对于不同的n值,对角线设置为-1,其余值从0增加1。例如,如果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的数组,使用: a=整数零((n,n)) 数值填充(a,-1) 因此,如果n=3,这将给出: [[-1,0,

在python中创建2D列表(或numpy数组)的最佳方法是什么?对于不同的n值,对角线设置为-1,其余值从0增加1。例如,如果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的数组,使用: a=整数零((n,n)) 数值填充(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]]