将行列值数据转换为数组 - numpy

时间:2014-10-23 21:25:57

标签: python arrays numpy reshape

我有长格式的数据,用于存储行#,列#和值,如下所示:

ROW  COLUMN   VALUE
  1       1       1
  1       3       3
  2       1       1
  2       2       2
  3       1       1
  3       2       2
  3       3       3

请注意,缺少某些ROW,COLUMN组合(例如,ROW = 1和COLUMN = 2没有值)。我想将其转换为3 x 3数组。缺少的行列组合由0填充:

   1    0   3
   1    2   0
   1    2   3

我最初解决这个问题的方法是声明一个空的3 x 3数组,在三列中读取1d数组并循环遍历行和列并根据值数组更新数组。对于小尺寸的情况,这似乎是可行的,但对于更高的尺寸,这似乎不是“Pythonic”方式。这个问题是否已在numpy包中的某些预制功能中解决?我调查了reshape - 但这假定没有缺失值。

1 个答案:

答案 0 :(得分:5)

在numpy数组中有行,列和值后,您可以执行以下操作。 (请注意,我采用了更为Pythonic的方法,将基于0的索引放在rowcol中。

以下是一维数组中的数据:

In [13]: row = np.array([0, 0, 1, 1, 2, 2, 2])

In [14]: col = np.array([0, 2, 0, 1, 0, 1, 2])

In [15]: values = np.array([11, 12, 13, 14, 15, 16, 17])

创建一个二维数组来保存值。我使用rowcol的最大值来确定数组应该有多大。如果rowcol不一定包含最后一行或列中的值,则可以使用其他一些值。

In [16]: a = np.zeros((row.max()+1, col.max()+1), dtype=values.dtype)

现在使用此作业填写值

In [17]: a[row, col] = values

Etvoilà

In [18]: a
Out[18]: 
array([[11,  0, 12],
       [13, 14,  0],
       [15, 16, 17]])

您的示例是一个3x3数组,但如果您实际上有更大的数组而不是很多条目,则可以考虑使用scipy sparse matrix。例如,以下是使用coo_matrix class从上述相同数据创建“COO”矩阵的方法:

In [25]: from scipy.sparse import coo_matrix

In [26]: c = coo_matrix((values, (row, col)), shape=(row.max()+1, col.max()+1))

In [27]: c
Out[27]: 
<3x3 sparse matrix of type '<type 'numpy.int64'>'
    with 7 stored elements in COOrdinate format>

In [28]: c.A
Out[28]: 
array([[11,  0, 12],
       [13, 14,  0],
       [15, 16, 17]])