我有一個索引向量(我們稱之為peo)、一個稀疏矩陣P和一個矩陣W。在 MATLAB 中,我可以執行以下操作:
P(peo, peo) = W(peo, peo)
有沒有辦法在 Python 中做同樣的事情,保持相同的計算和時間復雜度?
uj5u.com熱心網友回復:
選擇圖書館
如果您使用密集矩陣,則在 python 中有一種非常相似的表達方式。使用稀疏矩陣稍微復雜一些。一般來說,如果你的代碼沒有被密集矩陣拖慢太多并且記憶體不是問題,我會堅持使用 numpy 密集矩陣,因為它非常方便。(正如他們所說的過早優化是萬惡之源......或類似的東西)。但是,如果您真的需要稀疏矩陣,scipy 將為您提供一個選項。
密集矩陣
如果要使用密集矩陣,可以使用 numpy 來定義矩陣,并且peo應該定義為串列。這是一個例子:
import numpy as np
# Dummy matrices definition
peo = [1, 3, 4]
P = np.zeros((5, 5))
W = np.ones((5, 5))
# Assignment
P[peo, peo] = W[peo, peo]
print(W)
稀疏矩陣
對于稀疏矩陣,scipy 有一個名為sparse的包,它允許您像 matlab 一樣使用稀疏矩陣。它為您提供了一個實際的選擇,即在 matlab 沒有的地方應該如何表示矩陣。權力越大,責任越大。花時間閱讀每種表示的優缺點將幫助您為您的應用程式選擇正確的一種。
一般來說,很難保證完全相同的復雜性,因為語言不同,而且我不知道每種語言的復雜細節。但是稀疏矩陣的概念在 scipy 和 matlab 中是相同的,因此您可以期望復雜度具有可比性。(您甚至可能在 python 中更快,因為您可以選擇適合您需要的表示)。
請注意,在這種情況下,如果您想保持與您在 matlab 中描述的方式相同的作業方式,您應該選擇dok或lil表示。這是僅有的兩種允許高效索引訪問和稀疏更改的格式。
這是您要使用 dok 表示進行存檔的示例:
from scipy.sparse import dok_matrix
import numpy as np
# Dummy matrices definition
peo = [1, 2, 4]
P = dok_matrix((5, 5))
W = np.ones((5, 5))
# Assignment
P[peo, peo] = W[peo, peo]
print(P.toarray())
如果您對 Python 中稀疏矩陣表示和代數的優缺點感興趣,這里有一篇文章探討了這一點以及性能。這是因為它有點舊,所以持保留態度,但它背后的想法仍然大部分是正確的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522623.html
