2017-10-28 84 views
0

我試圖使一個矩陣爲:如何用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

回答

1

你最好不要使用庫函數。對於非對角元素分配使用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]] 
0

陣列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

1

有留在你定義你的問題的方式存在一些問題,但如果你想創建

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