2017-02-10 1 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) 

Sample вход, выход

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

Thats удивительный .. спасибо сэр .. может ли функция быть адаптирована к тому, где строка не находится в индексе 0 .. например [[1, 'A', 1], [1, 'A', 1], [1, 'B', 1], ...]] здесь находится в индексе 1. Как передать индекс в качестве аргумента? – adebesin

+0

@adebesin Отредактировано. Используйте параметр ввода 'colID':' colID = 1'. – Divakar

Смежные вопросы