我是python的新手,我有一个以下格式的文件:
2:10 13:1 17:6 21:10
3:11 131:12
...
每一行都包含column:value
形式的元素。在示例中,这意味着第一行应该在第二列中包含10,在第13列中包含1,依此类推。编辑:数据中的每一行对应矩阵中的一行
这是python知道如何转换为稀疏矩阵的格式吗? (例如,为了执行PCA)或者我必须自己构建矩阵吗?
答案 0 :(得分:1)
我正在做以下假设
我正在使用模块scipy.sparse
from scipy import sparse
I, J, V = [], [], []
for i, line in enumerate(open(datafile)):
for j, v in [map(int,item.split(':')) for item in line.split()]:
I.append(i) ; J.append(j-1) ; V.append(v)
A = sparse.coo_matrix((V,(I,J)), shape=(i+1,i+1)
print A.todense()
包含以下数据
1:2 3:4
2:5
上面的代码打印
[[2 0 4 0]
[0 0 0 0]
[0 0 0 0]
[0 5 0 0]]
答案 1 :(得分:0)
要使此任务内存高效且高效,请查看Collections库,特别是defaultdict。您只会存储具有相应列(键)的数据值。数据将不再是'矩阵,但这意味着您不必存储不存在的值。
(请注意我在您的数据中添加了' 2:11'因此一列会有多个值)
from collections import defaultdict
d = defaultdict(list)
data = '2:10 13:1 17:6 21:10 3:11 131:12 2:11'.split()
for x in data:
k = x.split(':')[0]
v = x.split(':')[1]
d[k].append(v)
print d
给出输出:
defaultdict(<type 'list'>, {'13': ['1'], '21': ['10'], '17': ['6'], '3': ['11'], '131': ['12'], '2': ['10','11]})
在这种情况下,您只存储具有值的列(字典键)。