在python中将三元组转换为矩阵/数据帧

时间:2016-01-23 08:01:26

标签: python scipy

我在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

这样做的最佳方式是什么?

1 个答案:

答案 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 - 如果是这样,您可能会从这里开始。