2015-10-02 202 views
1

我正在使用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

在你的榜样,有CSV块的6列。 “根据第一列分割数据”意味着什么。 6个csv块中的第一个或每个csv块的第一个项目?另外,如果您的字典密钥有重复,该怎么办? – vincent

+0

@vincent编辑了这个问题。因为它们是类标签,所以在第一列中会有重复项,所以它们应该添加到矩阵中。 –

+0

你愿意与这样的矩阵列表吗? – Divakar

回答

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其在最后一个拥有返回一个列表的片段作为列表

.. 。

{ 
'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

这个怎么样?

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'] 
       ] 
      } 
) 
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]])} 
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]])}