[英]Splitting matrix multiplication using einsum
我有一個大數據矩陣,我想計算該大矩陣的相似性矩陣,但是由於內存限制,我想拆分計算。
假設我有以下內容:例如,我采用了一個較小的矩陣
data1 = data/np.linalg.norm(data,axis=1)[:,None]
(Pdb) data1
array([[ 0. , 0. , 0. , ..., 0. ,
0. , 0. ],
[ 0. , 0. , 0. , ..., 0. ,
0. , 0. ],
[ 0.04777415, 0.00091094, 0.01326067, ..., 0. ,
0. , 0. ],
...,
[ 0. , 0.01503281, 0.00655707, ..., 0. ,
0. , 0. ],
[ 0.00418038, 0.00308079, 0.01893477, ..., 0. ,
0. , 0. ],
[ 0.06883803, 0. , 0.0209448 , ..., 0. ,
0. , 0. ]])
我嘗試執行以下操作:
similarity_matrix[n1:n2,m1:m2] = np.einsum('ik,jk->ij', data1[n1:n2,:], data1[m1:m2,:])
n1,n2,m1,m2的計算如下:(df是一個數據幀)
data = df.values
m, k = data.shape
n1=0; n2=m/2; m1=n2+1; m2=m;
但是錯誤是:
(Pdb) similarity_matrix[n1:n2,m1:m2] = np.einsum('ik,jk->ij', data1[n1:n2,:], data1[m1:m2,:])
*** NameError: name 'similarity_matrix' is not defined
你不是在做像
similarity_matrix = np.empty((N,M),dtype=float)
在您的計算開始時?
創建數組之前,不能在等式的右側或左側對數組進行索引。
如果完整的(N,M)
矩陣對於內存而言太大,則只需將einsum
值分配給另一個變量,然后使用該變量即可。
partial_matrix = np.einsum...
您如何將partial_matrix
與虛擬similarity_matrix
partial_matrix
相關聯是另一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.