2017-02-10 31 views
2

矩陣的名單上有以下形式的NumPy的矩陣:分區組在Python和NumPy的

dummy = np.array([['A', 1, 1], 
        ['A', 1, 1], 
        ['B', 1, 1], 
        ['C', 1, 1], 
        ['F', 1, 1], 
        ['I', 1, 1], 
        ['I', 1, 1], 
        ['I', 1, 1], 
        ['J', 1, 1], 
        ['K', 1, 1], 
        ['L', 1, 1], 
        ['M', 1, 1]]) 

什麼,我試圖產生是NumPy的矩陣的一個列表,其中只能有ñ每矩陣字符串值的不同變化,例如:

具有ñ = 4:

[array([['A', '1', '1'], 
     ['A', '1', '1'], 
     ['B', '1', '1'], 
     ['C', '1', '1'], 
     ['F', '1', '1']], <= 4 different groups (A,B,C,F) 
     dtype='|S1'), 
array([['I', '1', '1'], 
     ['I', '1', '1'], 
     ['I', '1', '1'], 
     ['J', '1', '1'], 
     ['K', '1', '1'], 
     ['L', '1', '1']], <= 4 different groups (I,J,K,L) 
     dtype='|S1'), 
array([['M', '1', '1']], <= only one but kept 
     dtype='|S1')] 

我有以下功能幾乎工程..

def partition_by(x, groups): 
    uniques = set([]) 
    p = [] 
    q = [] 
    for i in x: 
     if len(uniques) < groups or i[0] in uniques: 
      uniques.add(i[0]) 
      p.append(i.tolist()) 
    q.append(np.array(p)) 
    return q 

partition_by(dummy, 4) 

產量:

[array([['A', '1', '1'], 
     ['A', '1', '1'], 
     ['B', '1', '1'], 
     ['C', '1', '1'], 
     ['F', '1', '1']], 
     dtype='|S1')] 

回答

1

這裏有一個方法 -

def split_col_based(dummy, colID = 0, n=4): 
    mask = dummy[1:,colID] != dummy[:-1,colID] 
    interval_idx = n*(np.arange((mask.sum()+1)//n)+1) 
    idx = np.searchsorted(mask.cumsum(), interval_idx) 
    return np.split(dummy, idx+1, axis=0) 

樣品輸入,輸出

1)輸入陣列:

In [79]: dummy 
Out[79]: 
array([['A', '1', '1'], 
     ['A', '1', '1'], 
     ['B', '1', '1'], 
     ['C', '1', '1'], 
     ['F', '1', '1'], 
     ['I', '1', '1'], 
     ['I', '1', '1'], 
     ['I', '1', '1'], 
     ['J', '1', '1'], 
     ['K', '1', '1'], 
     ['L', '1', '1'], 
     ['M', '1', '1']], 
     dtype='|S1') 

2)輸出與n=4

In [80]: split_col_based(dummy, n=4) 
Out[80]: 
[array([['A', '1', '1'], 
     ['A', '1', '1'], 
     ['B', '1', '1'], 
     ['C', '1', '1'], 
     ['F', '1', '1']], 
     dtype='|S1'), array([['I', '1', '1'], 
     ['I', '1', '1'], 
     ['I', '1', '1'], 
     ['J', '1', '1'], 
     ['K', '1', '1'], 
     ['L', '1', '1']], 
     dtype='|S1'), array([['M', '1', '1']], 
     dtype='|S1')] 

3)輸出與n=5

In [81]: split_col_based(dummy, n=5) 
Out[81]: 
[array([['A', '1', '1'], 
     ['A', '1', '1'], 
     ['B', '1', '1'], 
     ['C', '1', '1'], 
     ['F', '1', '1'], 
     ['I', '1', '1'], 
     ['I', '1', '1'], 
     ['I', '1', '1']], 
     dtype='|S1'), array([['J', '1', '1'], 
     ['K', '1', '1'], 
     ['L', '1', '1'], 
     ['M', '1', '1']], 
     dtype='|S1')] 

4)輸出與n=2

In [84]: split_col_based(dummy, n=2) 
Out[84]: 
[array([['A', '1', '1'], 
     ['A', '1', '1'], 
     ['B', '1', '1']], 
     dtype='|S1'), array([['C', '1', '1'], 
     ['F', '1', '1']], 
     dtype='|S1'), array([['I', '1', '1'], 
     ['I', '1', '1'], 
     ['I', '1', '1'], 
     ['J', '1', '1']], 
     dtype='|S1'), array([['K', '1', '1'], 
     ['L', '1', '1']], 
     dtype='|S1'), array([['M', '1', '1']], 
     dtype='|S1')] 
+0

那真棒..謝謝先生..功能可以適應於哪裏字符串不在索引0處,例如[[1,'A',1],[1,'A',1],[1,'B',1],...]]在索引1處。我如何通過索引作爲參數? – adebesin

+0

@adebesin編輯。使用'colID'輸入參數:'colID = 1'。 – Divakar