我在scipy中使用csr矩阵。当我打印矩阵时,输出如下:
(669974, 73) 0.005
(669974, 74) 0.007
(669974, 75) 0.002
(669974, 76) 0.006
(669974, 77) 0.005
我想仅以三元组的形式将其转换为矩阵/数据帧。像:
col1 col2 val
669974 73 0.005
669974 74 0.007
669974 75 0.002
669974 76 0.006
669974 77 0.005
这样做的最佳方式是什么?
答案 0 :(得分:0)
稀疏矩阵样本:
In [363]: A=sparse.csr_matrix(np.arange(12).reshape(3,4))
将其显示为密集(常规numpy)数组(例如A.toarray()
)
In [364]: A.A
Out[364]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]], dtype=int32)
其repr
显示
In [365]: A
Out[365]:
<3x4 sparse matrix of type '<class 'numpy.int32'>'
with 11 stored elements in Compressed Sparse Row format>
它的str()
显示(你看到了什么)
In [366]: print(A)
(0, 1) 1
(0, 2) 2
(0, 3) 3
(1, 0) 4
(1, 1) 5
(1, 2) 6
(1, 3) 7
(2, 0) 8
(2, 1) 9
(2, 2) 10
(2, 3) 11
A.data
是其数据属性,即值。您可以使用nonzero
获取坐标:
In [368]: A.nonzero()
Out[368]:
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int32),
array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int32))
或将csr
转换为coo
格式,并获取所有3个数组:
In [369]: Ac=A.tocoo()
In [370]: Ac.data
Out[370]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype=int32)
In [371]: Ac.row
Out[371]: array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int32)
In [372]: Ac.col
Out[372]: array([1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int32)
您可以将它们变为3列数组:
In [373]: np.column_stack((Ac.col, Ac.row, Ac.data))
Out[373]:
array([[ 1, 0, 1],
[ 2, 0, 2],
[ 3, 0, 3],
[ 0, 1, 4],
[ 1, 1, 5],
[ 2, 1, 6],
[ 3, 1, 7],
[ 0, 2, 8],
[ 1, 2, 9],
[ 2, 2, 10],
[ 3, 2, 11]], dtype=int32)
除非您的数据是浮点数,否则这将成为所有浮点数。它不能混合整数和浮点数。
您可以将它们组装成一个带有2个int字段和一个float字段的结构化数组。如果需要,我可以详细说明。
但是您提到的数据框表明您熟悉pandas
- 如果是这样,您可能会从这里开始。