什么是以ijv / coo / triplet格式加载矩阵的最pythonic方式?

时间:2015-05-22 14:19:34

标签: python pandas scipy scikit-learn

我的输入文件是带有字符串列名的ijv / coo / triplet格式,例如:

Apple,Google,1
Apple,Banana,5
Microsoft,Orange,2

应该产生这个2x3矩阵:

[[1,5,0], [0,0,2]]

我可以通过将列名放到词典中来手动读取它,并创建一个scipy稀疏的coo_matrix,并将该dict映射到ID。我想最终在scipy稀疏或pandas数据帧中得到它。

还有更多的pythonic方式吗?熊猫只能阅读csv,有scipy.io,但他们也没有铜格式。因此,如果没有库,那么将它放入scipy.coo_matrixpandas.DataFrame的最pythonic方法是什么?

3 个答案:

答案 0 :(得分:1)

您需要定义从行/列名称到某些索引的明确映射(" Apple"是" 0"或" 1&#并不重要34;,只是它用数字表示,因此这不会与你的结果完全匹配,但它应该无关紧要)。在此示例中,'info.txt'包含

Apple,Google,1
Apple,Banana,5
Microsoft,Orange,2

以下是实现坐标矩阵的一种方法:

import numpy as np
from scipy.sparse import coo_matrix

input = np.loadtxt( 'info.txt', delimiter=',' , dtype=str)
rows,cols,data = input.T
map_rows = { val:ind for ind,val in enumerate( np.unique(rows) ) }
map_cols = { val:ind for ind,val in enumerate( np.unique(cols) ) }
result   = coo_matrix( (data.astype(float),( [map_rows[x] for x in rows], [map_cols[x] for x in cols]) ) )    

现在你有了映射和结果

print map_rows
#{'Apple': 0, 'Microsoft': 1}
print map_cols
#{'Banana': 0, 'Google': 1, 'Orange': 2}
print result.toarray()
#array([[ 5.,  1.,  0.],
#       [ 0.,  0.,  2.]])

答案 1 :(得分:0)

您可以使用csv:

matrix = []
with open('input_file', 'rb') as csvfile:
     input_reader = csv.reader(csvfile, delimiter=',')
     for row in input_reader:
         matrix.append([row[0], row[1], row[2]])

然后你会在matrix

中得到这个
[['Apple', 'Google', '1'], ['Apple', 'Banana', '5'], ['Microsoft', 'Orange', '2']]

如果你想要一个numpy矩阵,我相信根据documentation这应该有效:

nm_matrix = np.matrix(matrix)

答案 2 :(得分:-1)

[line.split(",") for line in open(input_file)]会工作吗?

该代码将读取文件中的每一行,拆分为逗号分隔的行,并将结果收集到列表中。