我有长格式的数据,用于存储行#,列#和值,如下所示:
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
- 但这假定没有缺失值。
答案 0 :(得分:5)
在numpy数组中有行,列和值后,您可以执行以下操作。 (请注意,我采用了更为Pythonic的方法,将基于0的索引放在row
和col
中。
以下是一维数组中的数据:
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])
创建一个二维数组来保存值。我使用row
和col
的最大值来确定数组应该有多大。如果row
和col
不一定包含最后一行或列中的值,则可以使用其他一些值。
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]])