2017-10-28 1 views
0

Ich versuche, eine Matrix zu machen, wie:Wie erstellt man eine Matrix mit einer anderen Liste mit Python?

s = [[s11 s12 s13 s14] 
    [s21 s22 s23 s24] 
    [s31 s32 s33 s34] 
    [s41 s42 s43 s44]] 

, wo ich jedes Array der durch s Matrix erhalten:

sii = a(i) ; for s11, s22, ... and s44 

sij = b(j)**2 + 10 ; for s12=s21, s23=s32,s13=s31, ... 

hier, a und b Listen von Daten:

a = [0.1, 0.25, 0.12, 0.45, 0.98] 
b = [0.1, 0.25, 0.12, 0.45, 0.98, 1] 

Also, wenn ich die folgenden:

import numpy as np 


a = np.array([0.1, 0.25, 0.12, 0.45, 0.98]) 
b = np.array([0.1, 0.25, 0.12, 0.45, 0.98, 1]) 

i = 4 # matrix order 
s = np.ones([i,i]) 

def matrix(s): 

    for i in range(len(a)): 
     s[i,i] = a[i] 
    for j in range(len(b)):   
     rc = (j + 1) % (len(b) - 1) 
     val = b[i] 
     s[rc+1, rc] = val   
     s[rc, rc + 1] = val   
    return s 

print(matrix(s)) 

Es gibt mir einen Fehler. Wie kann ich dieses Problem lösen? Vielen Dank.

+0

Warum 'b' haben Länge 10, wenn Sie versuchen, quadratische Matrix zu erstellen? – kvorobiev

+0

Oh. Nein. Das wird in den Arrays der Matrix außer Diagonale platziert. Zum Beispiel s12 = s21 = 0.1, s13 = s31 = 0.25, ... – ats22

+0

Bitte, siehe meine Antwort. – kvorobiev

Antwort

1

du bist besser dran Bibliotheksfunktionen verwenden. Für die Zuordnung von Off-Diagonalelementen verwenden Sie triu und tril wie unten; setzen Sie können auch die Diagonale mit np.diag

import numpy as np 

size=5 
off_diag=np.array(range(int(size*(size-1)/2))) 
diag=np.array(range(size))*10 

s=np.diag(diag) 
s[np.triu_indices(size, 1)]=off_diag 
s[np.tril_indices(size, -1)]=s.T[np.tril_indices(size, -1)] 

print(s) 



[[ 0 0 1 2 3] 
[ 0 10 4 5 6] 
[ 1 4 20 7 8] 
[ 2 5 7 30 9] 
[ 3 6 8 9 40]] 
0

Array a im Code enthält 5 Elemente und Matrix, um i Satz 4. Matrix s wird shape=(4, 4) haben, und Sie versuchen, 5-te Element zu adressieren.

for i in range(len(a)): 
    s[i,i] = a[i] 

Versuchen

a = np.array([0.1, 0.25, 0.12, 0.45, 0.98]) 
b = np.array([1, 2, 3, 4, 5]) 

i = 5 # matrix order should correspond to a length 
s = np.ones([i,i]) 
+0

@ ats22 1. Ihre 'b' Liste hat noch mehr Elemente, als 'a' (ich weiß nicht, kann dies nur Tippfehler sein). 2. Matrix-Reihenfolge sollte gleich Array-Länge (Array-Länge in Ihrem Code 5 für "a" und 6 für "b") und Matrix-Reihenfolge = 4. – kvorobiev

1

ein paar Probleme in der Art und Weise Es bleiben Sie Ihr Problem definiert haben, aber wenn Sie versuchen, die Matrix wie

array([[ 1, 12, 13, 14], 
     [ 12, 2, 23, 24], 
     [ 13, 23, 3, 34], 
     [ 14, 24, 34, 4]]) 

von Arrays zu erstellen

a = [1,2,3,4] 
b = [12, 13, 14, 23, 24, 34] 

dann können Sie dies in "reinen NumPy" ohne Python-Schleifen:

M = np.zeros((4,4)) 
M[np.triu_indices(4, 1)] = b 
M += M.T 
np.fill_diagonal(M, a) 

Das heißt, bauen Sie die obere Diagonale von b, machen Sie es symmetrisch, indem Sie die Transponierung hinzufügen, und füllen Sie dann die Diagonale mit den Elementen a.

+0

Es wird dieser Fehler: >>> M [np.triu_indices (4 , -1)] = b Traceback (letzter Aufruf zuletzt): Datei "", Zeile 1, in ValueError: Formkonflikt: Wert Array der Form (6,) konnte nicht zum Indizierungsergebnis der Form übertragen werden (13,) – ats22

+0

@ ats22 Sorry - falscher Offset. Es sollte 'M [np.triu_indices (4, 1)] = b 'sein: Ich habe es jetzt in der Antwort behoben. – xnx

Verwandte Themen