2016-03-27 11 views
4

Ana köşegenin üzerindeki tüm öğeler için 1'e sahip n n boyutunda sıfır n matris üreten bir python işlevi yazmak istiyorum. matris elemanının (N-2, N-1)Ana köşegen üzerinde 1 ile çapraz matris üretmek için kullanılan Python kodu

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 

Ancak sonuç, sadece 1 ile elde:

İşte kodudur.

Takılıyorum ve gerçekten kodumun doğru olduğunu düşünüyorum ve hatanın nerede olduğuna dair bir ipucu yok. Ve bunu nasıl düzeltebilirim? Herhangi biri yardım edebilir mi?

Teşekkürler.

+1

Sen – mfitzp

cevap

2

Her yinelemede matrisinizi sıfıra sıfırlarsınız. döngünün dışında zeros çağrıyı taşıyın ve iyi çalışıyor: Ayrıca n-1'e döngü gerekir

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

Not değil, n-2 (satır yalnızca 1 ile 1'ler sayısını azaltır yukarı hareket!). Bu yöntem ile eşleşen, aynı zamanda the answer from Swiernumpy yerleşik np.diag(np.ones(n-1),1) kullanarak bkz

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

: Burada yukarıdaki sabit fonksiyonun çıkışıdır.

+0

Teşekkür @mfitzp döngünün her tekrarında sıfıra matrisi sıfırlıyorsanız. Ama döngünün sınırı hakkında anlamadığım bir şey var. A [1,3], elemanın matris A'nın (2,4) pozisyonunda yer aldığı doğru mu? Yani nth satırından önce 1 satır (n-2) inci sıra olmalı? – user71346

+0

Bu doğru, ancak aralık döngüsü sadece ihtiyacınız olan 1 sayısını yinelemek. Ofset zaten Y [i, i + 1] tarafından belirlenir. 'Yukarı' (ya da 'karşı') hareket ettirme bir elemanın sayısını 1 ile azaltır. Aralık (0,5) 0,1,2,3,4 (no 5) üretecektir, yani n = 5 için 0, n-1) 0,1,2,3 – mfitzp

+0

Oh verir, evet. Teşekkürler. – user71346

8

numpy.diag işlevi tam olarak yapabilir:

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

ikinci bağımsız değişken (1) diyagonal için ofset ile. Veriler:

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

Çok küçük bir tazminat;) – jezrael

3

Sadece köşegen veya tüm üst üçgen için olanlar mı istiyorsunuz?

Orada endekse np.tri* fonksiyonları bir dizi var ve oluşturmak üst ve alt üçgen diziler:

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

Hatta iki tri aramalar

tavsiye edeceğimi
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]]) 

Değil bir köşegen oluşturabilir Bu np.diag işlevi üzerinde. :)

veya

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]]) 
İlgili konular