2015-10-02 398 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]])}