2017-03-17 87 views
0

我剛學pyhton和希望定義返回一個n×n的正方矩陣,具有預定義的值用於主對角線(I = j)的一個函數,上對角(J = + 1)和下對角線(J = I-1)和所有其他元素爲等於0。定義返回一個n×n的正方形矩陣的函數

任何幫助,將理解的是,

感謝


import numpy as np 
import scipy as sp 
n=6 
m=np.zeros((n,n)) 
for i in range(n): 
    m[i-1,i]=-1 
    m[i,i]=2 
    m[i,i-1]=1 
    m[0,n-1]=0 
    m[n-1,0]=0 
print m 
+0

後,你已經嘗試了代碼。 –

+0

進口numpy的作爲NP 進口SciPy的作爲SP N = 6 米= np.zeros((N,N)) 爲i的範圍(N): 米[I-1,I] = - 1 M [I,I] = 2 M [I,I-1] = 1 M [0,N-1] = 0 米[N-1,0] = 0 打印米 – Jdigs

+0

我移動你的代碼問題。它在那裏格式更好。 – hpaulj

回答

0

下面是一個方法,它使用numpy.diag並利用參數k來指定要修改的對角線,並在對角線上添加項目列表。

import numpy as np 

def create_diag(n, l): 
    arr = np.zeros((n, n)) 

    # check that l contains an odd number of elements 
    if len(l) % 2 != 1: 
     return arr 

    # check that we have at most the number of diagonals in the matrix 
    if len(l) >= 2*n: 
     return arr 

    # set limits of diagonals to set. setting 3 diagonals means limits=[-1,0,1]. setting 1 diagonal means limits=[0] 
    limit = int((len(l) - 1)/2) 
    limits = range(-limit, limit + 1) 

    # maps k-->list of values on the diagonal 
    diag_map = dict(zip(limits, l)) 
    for k, v in diag_map.items(): 
     diag = [v] * (n - abs(k)) 
     arr += np.diag(diag, k=k) 
    return arr 

# elements to put on the diagonal, centered about the main diagonal (i=j) 
l = [-1,1,2] 
n = 6 

diag_arr = create_diag(n, l) 

# [[ 1. 2. 0. 0. 0. 0.] 
# [-1. 1. 2. 0. 0. 0.] 
# [ 0. -1. 1. 2. 0. 0.] 
# [ 0. 0. -1. 1. 2. 0.] 
# [ 0. 0. 0. -1. 1. 2.] 
# [ 0. 0. 0. 0. -1. 1.]] 
+0

這就是完美!謝謝! – Jdigs

2

如果a,b,c是您的三個lis噸用於上對角線,主對角線,並分別斜下方,可以如下寫:

import numpy as np 
a=[1,2,3,4] 
b=[5,6,7,8,9] 
c=[10,11,12,13] 
n=len(b) 
m=np.zeros((n,n)) 
for i in range(0,n-1): 
    m[i,i+1]=a[i] 
    m[i,i]=b[i] 
    m[i+1,i]=c[i] 
m[n-1,n-1]=b[n-1] 
print(m) 

在上面的代碼初始化零矩陣,然後只更新上,下,和主對角線根據你的名單的條目。 輸出是

[[ 5. 1. 0. 0. 0.] 
[ 10. 6. 2. 0. 0.] 
[ 0. 11. 7. 3. 0.] 
[ 0. 0. 12. 8. 4.] 
[ 0. 0. 0. 13. 9.]] 

編輯:較短的方式,通過@hpaulj建議將是

m=np.diag(a,1)+np.diag(b,0)+np.diag(c,-1) 

np.diag(r,k)創建矩陣,其中k「個對角上方的主對角線(下面如果k是負)是r和條目的其餘均爲0。

查看文檔在這裏: https://docs.scipy.org/doc/numpy/reference/generated/numpy.diag.html

+0

播放用'np.diag(一,1)+ np.diag(B,0)+ np.diag(C,-1)' – hpaulj

+0

@hpaulj好的技巧。但是,我想,如果關閉這只是正常工作-diagonal元素是零 – kmario23