将稀疏矩阵转换为数据帧
Convert a sparse matrix to dataframe
我有一个稀疏矩阵,用于存储一组文档之间计算出的相似性。矩阵是一个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
此最终结果不包含矩阵对角线或零值。它还仅列出每个文档对一次(即仅在一行中)。是否有内置/有效的方法来实现此最终结果?任何指针将不胜感激。
谢谢!
将数据帧转换为数组:
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]
将其转换回数据帧:
df_ijv = pd.DataFrame(ijv)
我不确定这是否更快或其他任何方法,但执行中间步骤的另一种方法是将 numpy 数组转换为 ijv
或 "triplet" 稀疏矩阵:
from scipy import sparse
coo = sparse.coo_matrix(x)
ijv = np.concatenate((coo.row, coo.col, coo.data)).reshape(3, -1).T
现在给定一个对称的距离矩阵,你需要做的就是让非零元素保持在右上三角。你可以遍历这些。或者您可以使用 np.triu_indices_from(x, k=1)
预先屏蔽数组,但这种做法违背了这种据称更快的方法的全部目的...嗯。
我有一个稀疏矩阵,用于存储一组文档之间计算出的相似性。矩阵是一个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
此最终结果不包含矩阵对角线或零值。它还仅列出每个文档对一次(即仅在一行中)。是否有内置/有效的方法来实现此最终结果?任何指针将不胜感激。
谢谢!
将数据帧转换为数组:
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]
将其转换回数据帧:
df_ijv = pd.DataFrame(ijv)
我不确定这是否更快或其他任何方法,但执行中间步骤的另一种方法是将 numpy 数组转换为 ijv
或 "triplet" 稀疏矩阵:
from scipy import sparse
coo = sparse.coo_matrix(x)
ijv = np.concatenate((coo.row, coo.col, coo.data)).reshape(3, -1).T
现在给定一个对称的距离矩阵,你需要做的就是让非零元素保持在右上三角。你可以遍历这些。或者您可以使用 np.triu_indices_from(x, k=1)
预先屏蔽数组,但这种做法违背了这种据称更快的方法的全部目的...嗯。