2016-01-23 428 views
1

我在scipy中使用csr矩阵。当我打印的矩阵,输出是这样的:在Python中将三元组转换为矩阵/数据框

(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

样品稀疏矩阵:

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)) 

或转换csrcoo格式,并得到所有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 - 如果是这样的话,您可能可以从此处获取它。

+0

非常感谢..它的工作! – user3775161