如何用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))
它给了我一个错误。我怎么解决这个问题?谢谢。
答
你最好不要使用库函数。对于非对角元素分配使用triu
和tril
如下;您还可以设置对角线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
的元素填充对角线。
为什么'b'的长度是10,如果你想创建方矩阵? – kvorobiev
哦。不会的。除了对角线之外,它将放置在矩阵的阵列中。例如,s12 = s21 = 0.1,s13 = s31 = 0.25,... – ats22
请参阅我的回答。 – kvorobiev