我的输入文件是ijv/coo/triplet格式的字符串列名,例如:
Apple,Google,1
Apple,Banana,5
Microsoft,Orange,2
应该得到这个2x3矩阵:
[[1,5,0], [0,0,2]]
我可以通过将列名放入字典并使用该字典映射到id创建一个scipy sparse coo_matrix来手动读取它。我想把它放在scipy sparse或者pandas dataframe中。
还有什么更python的方法吗?熊猫只能读csv,有scipy.io
,但是它们也没有coo格式。那么,如果没有库,将它放入scipy.coo_matrix
或pandas.DataFrame
的最python的方法是什么?
您需要定义从行/列名称到某些索引的明确映射("Apple"是"0"还是"1"并不重要,只是它由数字表示,因此这不会完全匹配您的结果,但这应该无关紧要)。在本例中,'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.]])
您可以使用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矩阵,我相信根据文档这应该工作:
nm_matrix = np.matrix(matrix)
[line.split(",") for line in open(input_file)]
会工作吗?
该代码将读取文件中的每一行,分成逗号分隔的行,并将结果收集到一个列表中。