[英]How to make a matrix with different list with 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]]
在定義問題的方式中仍然存在一些問題,但是如果您嘗試創建矩陣,例如
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]
那么您可以在沒有Python循環的情況下在“純NumPy”中執行此操作:
M = np.zeros((4,4))
M[np.triu_indices(4, 1)] = b
M += M.T
np.fill_diagonal(M, a)
也就是說,從建立的上對角線b
,使其對稱通過將轉置,然后填充所述對角線的元素a
。
您的代碼中的數組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])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.