簡體   English   中英

如何使用python創建具有不同列表的矩陣?

[英]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)) 

它給了我一個錯誤。 我怎么解決這個問題? 謝謝。

您最好使用庫函數。 對於非對角線元素分配,請使用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]]

在定義問題的方式中仍然存在一些問題,但是如果您嘗試創建矩陣,例如

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM