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

时间:2017-11-11 14:01:03

标签: python arrays numpy nested-lists diagonal

在python中创建2D列表(或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,用:     a = numpy.zeros((n,n))     numpy.fill_diagonal(一,-1)

因此,如果n = 3,这将给出:

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

一种方法 -

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]])

答案 1 :(得分:0)

这是一种算术方式:

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]]