2014-01-22 2 views
1

У меня есть следующая проблема нарезания в numpy.Обрезка нескольких строк по одному индексу

a = np.arange(36).reshape(-1,4) 
a 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15], 
     [16, 17, 18, 19], 
     [20, 21, 22, 23], 
     [24, 25, 26, 27], 
     [28, 29, 30, 31], 
     [32, 33, 34, 35]]) 

В моей задаче всегда три строки представляют один образец, в моих координатах.

Я хочу, чтобы получить доступ к этой матрицы таким образом, что, если я использую [0: 2], чтобы получить следующее:

array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15], 
     [16, 17, 18, 19], 
     [20, 21, 22, 23]] 

Таковы первые две координируют образцы. Мне нужно извлечь большое количество этих наборов координат из массива.

Благодаря

Основываясь на How do you split a list into evenly sized chunks?, я нашел следующее решение, которое дает мне желаемый результат.

def chunks(l, n, indices): 
    return np.vstack([l[idx*n:idx*n+n] for idx in indices]) 
chunks(a,3,[0,2]) 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [24, 25, 26, 27], 
     [28, 29, 30, 31], 
     [32, 33, 34, 35]]) 

Возможно, это решение может быть улучшено, и кому-то не потребуется штабелирование.

+0

возможно дубликат [Как вы разделяете список в куски равномерного размера в Python?] (http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python) – mhlester

+2

Просто сделайте это ' a [0: 2 * 3] 'в общем' a [i * 3, j * 3] ' –

+0

' .reshape (-1,3,4) ' – M4rtini

ответ

1

Если три строки представляют собой образец, вы можете изменить свой массив, чтобы отразить это, используйте фантазии индексацию, чтобы получить ваши образцы, а затем отменить изменения формы:

>>> a = a.reshape(-1, 3, 4) 
>>> a[[0, 2]].reshape(-1, 4) 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [24, 25, 26, 27], 
     [28, 29, 30, 31], 
     [32, 33, 34, 35]]) 
Смежные вопросы