【问题标题】:Splitting matrix multiplication using einsum使用 einsum 拆分矩阵乘法
【发布时间】:2015-05-01 19:03:56
【问题描述】:

我有一个大数据矩阵,我想计算该大矩阵的相似度矩阵,但由于内存限制,我想拆分计算。

假设我有以下内容:例如,我采用了一个较小的矩阵

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

【问题讨论】:

    标签: python numpy matrix-multiplication numpy-einsum


    【解决方案1】:

    你没有做过类似的事情

    similarity_matrix = np.empty((N,M),dtype=float)
    

    在您的计算开始时?

    在创建数组之前,您不能在等式的右侧或左侧为数组编制索引。

    如果完整的 (N,M) 矩阵对于内存来说太大了,那么只需将您的 einsum 值分配给另一个变量,然后使用它。

    partial_matrix = np.einsum...
    

    你如何将partial_matrix 与虚拟similarity_matrix 联系起来是一个不同的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 2019-03-13
      • 1970-01-01
      • 2019-05-06
      • 2011-06-18
      相关资源
      最近更新 更多