簡體   English   中英

用數組中的元素乘以 Python 稀疏矩陣的行和列

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

由於浮點運算的限制,數值略有偏差 如果舍入誤差不可接受,請使用小數模塊。

我使用這種組合:

def multiply(matrix, vector, axis):
    if axis == 1:
        val = np.repeat(array, matrix.getnnz(axis=1))
        matrix.data *= val
    else:
        matrix = matrix.multiply(vector)
    return matrix

當軸為 1(乘以行)時,我復制此解決方案的第二種方法,當軸為 0(乘以列)時,我使用乘法

就地結果(軸 = 1)更有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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