2017-11-11 142 views
1

什么是在python中创建一个2D列表(或numpy数组)的最佳方式,其中对角线设置为-1,其余值从0增加1,不同的n值。例如,如果n = 3的阵列看起来像:在一个numpy数组中围绕一个定义的对角线增加值

[[-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(一,-1)

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

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

但是,我会如何设置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]]) 
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]]