2017-11-11 37 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]]