2016-03-27 6 views
4

サイズnのn個の行列を生成するpython関数を書くと、これは主対角線の上のすべての要素に対して1を持ちます。行列の要素(N-2、N-1)メイン対角の上に1をつけた対角行列を生成するPythonコード

def funtest(n): 
    for i in range(0,n-2): 
     s = (n,n) 
     Y = zeros(s) 
     Z = Y 
     Z[i,i+1]=1   
return Z 

が、結果はわずかに1を与える:

はここに私のコードです。

私は立ち往生しています。私のコードは正しいと思いますが、間違いがどこにあるのか分かりません。それをどうやって修正することができますか?誰でも助けてくれますか?

ありがとうございました。

+1

あなたが – mfitzp

答えて

2

各繰り返しでマトリックスをゼロにリセットしています。ループの外zerosコールを移動し、それが正常に動作します:あなたはまた、N-1にループする必要がある

def funtest(n): 
    s = (n,n) 
    Y = zeros(s) 
    for i in range(0,n-1): 
     Y[i,i+1]=1   
    return Y 

注意を、ないのn-2(行は1つだけで1の数を減らす上に移動! )。ここでは上記の固定機能の出力です:

funtest(5) 

array([[ 0., 1., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 0.]]) 

は、これはあなたの方法に一致するが、また、numpy組み込みnp.diag(np.ones(n-1),1)を使用してthe answer from Swierを参照してください。第二引数(1)対角のオフセットで

import numpy as np 
print(np.diag(np.ones(4), 1)) 

+0

おかげ@mfitzpループの各反復でゼロにマトリックスをリセットしています。しかし、ループの限界について私が理解していないことが1つあります。 A [1,3]が行列Aの(2,4)の位置に要素を与えるのは本当ですか?だから1行目はn行目が(n-2)行目になるはずですか? – user71346

+0

これは当てはまりますが、範囲ループは単純に必要な数の1を繰り返します。オフセットは、Y [i、i + 1]によって既に決定されている。 1つの要素を1だけ減らす(0,5)と、0,1,2,3,4(no 5)が生成されるので、n = 5の範囲( 0、n-1)は0,1,2,3を返します。 – mfitzp

+0

ああ、はい。ありがとう。 – user71346

8

numpy.diag機能は、まさにこれを行うことができます。それは与える:

array([[ 0., 1., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 1.], 
     [ 0., 0., 0., 0., 0.]]) 
+1

小さな補償;) – jezrael

3

ちょうど斜めの、または全体の上三角形のものをしたいですか?

ありnp.tri*関数のセットがインデックスにだと上下の三角配列を作成します。

In [395]: np.triu(np.ones((5,5),int),1) 
Out[395]: 
array([[0, 1, 1, 1, 1], 
     [0, 0, 1, 1, 1], 
     [0, 0, 0, 1, 1], 
     [0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0]]) 

私も、私がお勧めしたいこと2つのtri通話

In [399]: np.tril(np.triu(np.ones((5,5),int),1),1) 
Out[399]: 
array([[0, 1, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0], 
     [0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0]]) 

ないと対角線を作成することができますこれはnp.diag関数上です。 :)

または

In [404]: np.diagflat(np.ones(4,int),1) 
Out[404]: 
array([[0, 1, 0, 0, 0], 
     [0, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0], 
     [0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0]]) 
関連する問題