将稀疏矩阵转换为数据框

时间:2020-04-28 08:31:21

标签: pandas numpy sparse-matrix

我有一个稀疏矩阵,用于存储一组文档之间的计算相似度。矩阵是一个ndarray。

         0         1         2         3         4          
0        1.000000  0.000000  0.000000  0.000000  0.000000  
1        0.000000  1.000000  0.067279  0.000000  0.000000  
2        0.000000  0.067279  1.000000  0.025758  0.012039  
3        0.000000  0.000000  0.025758  1.000000  0.000000  
4        0.000000  0.000000  0.012039  0.000000  1.000000  

我想按如下方式将此数据转换为3维数据框。

docA docB similarity
1    2    0.067279
2    3    0.025758
2    4    0.012039

此最终结果不包含矩阵对角线或零值。它还仅列出每个文档对一次(即,仅一行)。是否有内置/有效的方法来实现此最终结果?任何指针将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

将数据框转换为数组:

<Style x:Key="TextBoxStyle" TargetType="TextBox">            
        <Style.Triggers>
            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                <Setter Property="CaretBrush" Value="White"/>
            </Trigger>
        </Style.Triggers>
</Style>

从稀疏对称距离矩阵中获取非对角非零项的列表:

x = df.to_numpy()

将其转换回数据框:

i, j = np.triu_indices_from(x, k=1)
v = x[i, j]
ijv = np.concatenate((i, j, v)).reshape(3, -1).T
ijv = ijv[v != 0.0]

我不确定这是更快还是什么,但是做中间步骤的另一种方法是将numpy数组转换为df_ijv = pd.DataFrame(ijv) 或“三胞胎”稀疏矩阵:

ijv

现在给定一个对称的距离矩阵,您所要做的就是将非零元素保留在右上三角形上。您可以遍历这些。或者,您可以使用from scipy import sparse coo = sparse.coo_matrix(x) ijv = np.concatenate((coo.row, coo.col, coo.data)).reshape(3, -1).T 预先掩盖数组,但是这种方法无法实现这种据称更快的方法……hmmm。