[英]Multiplying Rows and Columns of Python Sparse Matrix by elements in an Array
我有一個 numpy 數組,例如:
array = [0.2, 0.3, 0.4]
(這個向量的大小實際上是 300k 密集,我只是用簡單的例子來說明)
以及使用 Scipy 創建的稀疏對稱矩陣,如下所示:
M = [[0, 1, 2]
[1, 0, 1]
[2, 1, 0]]
(表示為密集只是為了說明;在我真正的問題中,它是一個 (300k x 300k) 稀疏矩陣)
是否可以將所有行乘以數組中的元素,然后對列進行相同的操作?
這將首先導致:
M = [[0 * 0.2, 1 * 0.2, 2 * 0.2]
[1 * 0.3, 0 * 0.3, 1 * 0.3]
[2 * 0.4, 1 * 0.4, 0 * 0.4]]
(行乘以數組中的元素)
M = [[0, 0.2, 0.4]
[0.3, 0, 0.3]
[0.8, 0.4, 0]]
然后將列相乘:
M = [[0 * 0.2, 0.2 * 0.3, 0.4 * 0.4]
[0.3 * 0.2, 0 * 0.3, 0.3 * 0.4]
[0.8 * 0.2, 0.4 * 0.3, 0 * 0.4]]
最終導致:
M = [[0, 0.06, 0.16]
[0.06, 0, 0.12]
[0.16, 0.12, 0]]
我嘗試應用我在此線程中找到的解決方案,但沒有奏效; 我按照建議將 M 的數據乘以數組中的元素,然后轉置矩陣並應用相同的操作,但結果不正確,仍然不明白為什么!
只是指出這一點,我將運行此操作的矩陣有點大,它有 2000 萬個非零元素,因此效率非常重要!
我感謝您的幫助!
編輯:
按位解決方案效果很好。 這里計算這個操作需要 1.72 秒,但這對我們的工作沒問題。 天啊!
通常,您希望避免循環並使用矩陣運算來提高速度和效率。 在這種情況下,解決方案是簡單的線性代數,或者更具體地說是矩陣乘法。
要將 M 的列乘以數組 A,請乘以 M*diag(A)。 要將 M 的行乘以 A,請乘以 diag(A)*M。 兩者都做:diag(A)*M*diag(A),可以通過以下方式完成:
numpy.dot(numpy.dot(a, m), a)
diag(A) 這里是一個矩陣,除了在對角線上有 A 外,全為零。 您可以使用方法輕松創建此矩陣(例如 numpy.diag() 和 scipy.sparse.diags())。
我希望這運行得非常快。
以下應該工作:
[[x*array[i]*array[j] for j, x in enumerate(row)] for i, row in enumerate(M)]
例子:
>>> array = [0.2, 0.3, 0.4]
>>> M = [[0, 1, 2], [1, 0, 1], [2, 1, 0]]
>>> [[x*array[i]*array[j] for j, x in enumerate(row)] for i, row in enumerate(M)]
[[0.0, 0.059999999999999998, 0.16000000000000003], [0.059999999999999998, 0.0, 0.12], [0.16000000000000003, 0.12, 0.0]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.