[英]Fast vector/sparse-matrix/vector multiplication
我想執行兩個一維 arrays x 和 y 的“稀疏外積”,受限於稀疏的“模板矩陣”T。例如,我想計算類似
x= np.array([1,2,3,4])
y= np.array([5,6,7])
T=np.array([[1,0,0],[0,0,1],[1,1,0],[0,1,0]])
np.multiply(T,np.outer(x,y))
產生
array([[ 5, 0, 0],
[ 0, 0, 14],
[15, 18, 0],
[ 0, 24, 0]])
挑戰在於如何做到這一點。 這個朴素代碼的基本計算問題是它在外積中執行了許多不必要的乘法。 一個人應該只需要在模板非零的情況下執行乘法。
我嘗試過使用 SciPy 稀疏方法,例如:
T_lil=lil_matrix(T)
T_csr=T_lil.tocsr()
diags(x).dot(T_csr.dot(diags(y)))
這從理論上避免了不必要的乘法,方法是先將 T 應用於 y,然后將 x 應用於結果。 它在大尺寸上獲得了速度優勢,但對於較小尺寸來說速度太慢了,我知道它不可能是最佳的。
我也嘗試過類似的東西
x_column=np.array([x]).T
(T_csr.multiply(x_column)).multiply(y)
其中(在 apply.toarray() 之后)給出了相同的答案,但這是荒謬的笨拙並且再次不能是最佳的。
我認為將 x 和 y 轉換為稀疏編碼不會有幫助,因為它們在我的應用程序中通常不是稀疏的。
有人可以幫忙嗎? 對於我的應用程序,T 可能有 10^4 行和 10^5 列。 我完全不介意深入研究 csr(或 csc 或 coo 或 dok)編碼的內容,但我希望有人知道比我能想到的更好的答案。
這是您可以使用 COO 格式的T
矩陣執行的一些簡單操作。 使用高級索引將T.data
乘以x
和y
的正確元素:
result = coo_matrix((T.data * x[T.row] * y[T.col], (T.row.copy(), T.col.copy())),
shape=T.shape)
copy
調用避免了一些修改T
或result
之一可能會影響另一個的情況。 如果您確定不會修改矩陣,則可以刪除它們。
此外,請注意此result
可能有明確的零,特別是如果x
或y
有任何零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.