2017-03-17 5 views
0

私はちょうどpyhtonを学習しており、主対角(i = j)、上対角(j = i + 1)と下対角(J = I-1)および他のすべての要素a,b,cはあなたであれば任意の助けは、は、nxn正方行列を返す関数を定義します

おかげ


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

あなたが試したコードを投稿してください。 - M [I-1、I] =レンジ(N)におけるiに対するSP としてNP インポートscipyのダウンロードとして –

+0

インポートnumpyのN = 6 M =のnp.zeros((N、N)) Iが移動1 M [I、I] = 2 M [I、I-1] 1 M [0、N-1] = = 0 M [N-1,0] 0 印刷M – 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

thats完璧!ありがとうございました! – Jdigs

2

を理解されるであろう0等しい

すべき3リスそれぞれ、上側の対角主対角線、及び下対角線のためのT以下のように、あなたはそれを書くことができる:もし上記のコードで

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

編集ある:短い方法、マトリックスを作成

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

np.diag(r,k)あろう@hpauljによって示唆されるで(主対角線上対角線番目kkがある場合は、以下負の値)はrであり、残りのエントリは0です。

https://docs.scipy.org/doc/numpy/reference/generated/numpy.diag.html

+0

「np.diag(a、1)+ np.diag(b、0)+ np.diag(c、-1)」で遊ぶ – hpaulj

+0

@hpaulj素晴らしいトリック..しかし、 - 対角要素はゼロです – kmario23

関連する問題