我正在使用python进行机器学习问题。我的数据如下所示,格式为csv,每行的格式为:<class-label>, feature_1, feature_2,....
一个例子是:
1,0,0,3,4,5
3,0,0,9,0,0
5,0,0,2,2,2
1,0,1,5,0,0
5,0,1,3,0,0
5,1,0,0,4,0
我需要根据第一列拆分数据。在给定的情况下,我应该有一个包含3个条目的字典,每个条目都有一个特征矩阵的值。当然,我可以迭代,但我正在寻找更多的单行来做到这一点。
编辑: 所以答案应该是这样的:
1 => [ [0,0,3,4,5],
[0,1,5,0,0]]
3 => [ [0,0,9,0,0]]
5 => [ [0,0,2,2,2],
[0,1,3,0,0],
[1,0,0,4,0]]
答案 0 :(得分:1)
使用numpy工具:
tab=np.loadtxt('data.txt',delimiter=',',dtype=int)
labels,data=tab[:,0],tab[:,1:]
dic= {label: data[labels==label] for label in np.unique(labels)}
给:
{1: array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]),
3: array([[0, 0, 9, 0, 0]]),
5: array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])}
答案 1 :(得分:0)
a = {}
with open('infile.csv') as f:
for line in f:
L = line.strip().split(',')
if L[0] in a.keys():
a[L[0]].append(L[1:])
else:
a[L[0]] = [L[1:]]
此示例使用array slicing将列表的各个部分作为列表返回
最后a持有......
{
'1': [
['0', '0', '3', '4', '5'],
['0', '1', '5', '0', '0']
],
'3': [
['0', '0', '9', '0', '0']
],
'5': [
['0', '0', '2', '2', '2'],
['0', '1', '3', '0', '0'],
['1', '0', '0', '4', '0']
]
}
答案 2 :(得分:0)
这个怎么样?
from collections import defaultdict
dd = defaultdict(list)
lines = [
'1,0,0,3,4,5',
'3,0,0,3,4,5',
'5,0,0,3,4,5',
'1,0,0,3,4,5',
'5,0,0,3,4,5',
'5,0,0,3,4,5'
]
[ dd[line.split(',')[0]].append(line.split(',')[1:]) for line in lines ]
print dd
然后dd =
defaultdict(<type 'list'>,
{'1': [
['0', '0', '3', '4', '5'],
['0', '0', '3', '4', '5']
],
'3': [
['0', '0', '3', '4', '5']
],
'5': [
['0', '0', '3', '4', '5'],
['0', '0', '3', '4', '5'],
['0', '0', '3', '4', '5']
]
}
)
答案 3 :(得分:0)
假设A
将数据存储为2D numpy array
,您可以执行以下操作 -
unqA = np.unique(A[:,0])
out = {unqA[i]:A[A[:,0]==unqA[i],1:] for i in range(len(unqA))}
示例运行 -
In [109]: A
Out[109]:
array([[1, 0, 0, 3, 4, 5],
[3, 0, 0, 9, 0, 0],
[5, 0, 0, 2, 2, 2],
[1, 0, 1, 5, 0, 0],
[5, 0, 1, 3, 0, 0],
[5, 1, 0, 0, 4, 0]])
In [110]: unqA = np.unique(A[:,0])
In [111]: {unqA[i]:A[A[:,0]==unqA[i],1:] for i in range(len(unqA))}
Out[111]:
{1: array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]),
3: array([[0, 0, 9, 0, 0]]),
5: array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])}
如果您对输出这样的矩阵列表没问题,可以避免像这样循环 -
sortedA = A[A[:,0].argsort()]
_,idx = np.unique(sortedA[:,0],return_index=True)
out = np.split(sortedA[:,1:],idx[1:],axis=0)
示例运行 -
In [143]: A
Out[143]:
array([[1, 0, 0, 3, 4, 5],
[3, 0, 0, 9, 0, 0],
[5, 0, 0, 2, 2, 2],
[1, 0, 1, 5, 0, 0],
[5, 0, 1, 3, 0, 0],
[5, 1, 0, 0, 4, 0]])
In [144]: sortedA = A[A[:,0].argsort()]
In [145]: _,idx = np.unique(sortedA[:,0],return_index=True)
In [146]: np.split(sortedA[:,1:],idx[1:],axis=0)
Out[146]:
[array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]), array([[0, 0, 9, 0, 0]]), array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])]
现在,如果你仍想要dict-based
输出,你可以使用上面的输出,就像这样 -
out_dict = {sortedA[:,0][idx[i]]:out[i] for i in range(len(idx))}
给我们 -
In [153]: out
Out[153]:
[array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]), array([[0, 0, 9, 0, 0]]), array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])]
In [154]: {sortedA[:,0][idx[i]]:out[i] for i in range(len(idx))}
Out[154]:
{1: array([[0, 0, 3, 4, 5],
[0, 1, 5, 0, 0]]),
3: array([[0, 0, 9, 0, 0]]),
5: array([[0, 0, 2, 2, 2],
[0, 1, 3, 0, 0],
[1, 0, 0, 4, 0]])}