Estoy tratando de hacer una matriz como:

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

Donde puedo obtener cada matriz de la matriz por:

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

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

Aquí, ayb son listas de datos:

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

Entonces cuando uso lo siguiente:

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

Me da un error. ¿Como puedó resolver esté problema? Gracias.

0
ats22 28 oct. 2017 a las 20:45

3 respuestas

La mejor respuesta

Es mejor usar las funciones de la biblioteca. Para la asignación de elementos fuera de la diagonal, use triu y tril como se muestra a continuación; también puedes establecer la diagonal con 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]]
1
karakfa 28 oct. 2017 a las 18:32

La matriz a en su código contiene 5 elementos, y el orden de la matriz i establecido en 4. La matriz s tendrá shape=(4, 4) y está tratando de abordar el 5º elemento.

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

Tratar

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
kvorobiev 28 oct. 2017 a las 18:04

Sigue habiendo algunos problemas en la forma en que ha definido su problema, pero si está tratando de crear la matriz como

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

De matrices

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

Entonces puedes hacer esto en "NumPy puro" sin bucles Python:

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

Es decir, construya la diagonal superior a partir de b, hágalo simétrico agregando la transposición y luego llenando la diagonal con los elementos de a.

1
xnx 29 oct. 2017 a las 10:36