如何用python制作不同列表的矩阵?

问题描述:

我试图使一个矩阵为:如何用python制作不同列表的矩阵?

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

在哪里可以得到通过的矩阵S每个阵列:

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

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

这里,a和b是数据列表:

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

所以,当我使用以下命令:

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

它给了我一个错误。我怎么解决这个问题?谢谢。

+0

为什么'b'的长度是10,如果你想创建方矩阵? – kvorobiev

+0

哦。不会的。除了对角线之外,它将放置在矩阵的阵列中。例如,s12 = s21 = 0.1,s13 = s31 = 0.25,... – ats22

+0

请参阅我的回答。 – kvorobiev

你最好不要使用库函数。对于非对角元素分配使用triutril如下;您还可以设置对角线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]] 

阵列a在你的代码中包含5种元素,以及矩阵为了i设置为4矩阵s将有shape=(4, 4),你试图解决5个元素。

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

尝试

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.你的'b'列表中仍然有更多的元素,而不是'a'(我不知道,可能只是这个错字)。 2.矩阵顺序应该和数组长度相同(数组长度在你的代码5中为'a'和6为'b'),矩阵顺序= 4。 – kvorobiev

有留在你定义你的问题的方式存在一些问题,但如果你想创建

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

从阵列矩阵

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

那么您可以在 “纯NumPy的” 做没有Python的循环:

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

即从b构建上对角线,通过添加转置使其对称,然后用a的元素填充对角线。

+0

它得到这个错误:>>> M [np.triu_indices(4 ,-1)] = b Traceback(最近一次调用最后一次): 文件“”,第1行,在 ValueError:形状不匹配:形状的值数组(6,)无法广播到形状的索引结果(13,) – ats22

+0

@ ats22对不起 - 错误的偏移量。它应该是'M [np.triu_indices(4,1)] = b':我现在已经修复了它的答案。 – xnx